From 8297a254f4eeade481dfa39130558d9a8e4c90c9 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Tue, 8 Aug 2023 14:26:54 +0200 Subject: [PATCH 001/220] Move project related class to io sub-package. --- .../java/org/mastodon/mamut/ProjectManager.java | 14 +++++++------- .../mastodon/mamut/feature/MamutPlayground.java | 4 ++-- .../mamut/feature/MamutRawFeatureModelIO.java | 4 ++-- .../mastodon/mamut/importer/tgmm/TgmmImporter.java | 2 +- .../mamut/importer/trackmate/MamutExporter.java | 2 +- .../importer/trackmate/TrackMateImporter.java | 2 +- .../{ => io}/project/MamutImagePlusProject.java | 2 +- .../mamut/{ => io}/project/MamutProject.java | 2 +- .../mamut/{ => io}/project/MamutProjectIO.java | 2 +- .../mastodon/mamut/{ => io}/project/ReadZip.java | 2 +- .../mastodon/mamut/{ => io}/project/WriteZip.java | 2 +- .../mamut/{ => io}/project/package-info.java | 2 +- .../mamut/launcher/MastodonDndLauncher.java | 5 ++--- .../mastodon/mamut/launcher/MastodonLauncher.java | 6 +++--- src/main/java/org/mastodon/mamut/model/Model.java | 2 +- .../views/bdv/overlay/ui/DummyBdvPanel.java | 2 +- .../views/grapher/display/GrapherSidePanel.java | 6 +++--- .../java/org/mastodon/StartMastodonOnProject.java | 2 +- .../org/mastodon/graph/BranchGraphExample.java | 4 ++-- .../java/org/mastodon/mamut/CloseListenerTest.java | 4 ++-- .../org/mastodon/mamut/GarbageCollectionTest.java | 4 ++-- .../org/mastodon/mamut/ProjectManagerTest.java | 4 ++-- .../mamut/StartMastodonWithMissingImageDemo.java | 2 +- .../mamut/feature/FeatureSerializerTestUtils.java | 2 +- .../mamut/feature/RawDeserializationExample.java | 4 ++-- .../mamut/feature/SerializeFeatureExample.java | 4 ++-- .../mamut/feature/SpotIntensityBenchmark.java | 4 ++-- .../mamut/feature/SpotIntensityUpdateExample.java | 4 ++-- .../feature/ui/FeatureColorModeConfigPageDemo.java | 4 ++-- .../mamut/importer/MaMuTExportExample.java | 4 ++-- .../mamut/importer/MaMuTImporterExample.java | 2 +- .../mamut/importer/TrackMateImporterTest.java | 2 +- .../importer/trackmate/MaMuTExporterTest.java | 4 ++-- .../mastodon/mamut/project/MamutProjectIOTest.java | 2 ++ .../mamut/tags/PlayingWithTagsExample.java | 2 +- src/test/java/org/mastodon/util/MastodonUtils.java | 4 ++-- 36 files changed, 62 insertions(+), 61 deletions(-) rename src/main/java/org/mastodon/mamut/{ => io}/project/MamutImagePlusProject.java (98%) rename src/main/java/org/mastodon/mamut/{ => io}/project/MamutProject.java (99%) rename src/main/java/org/mastodon/mamut/{ => io}/project/MamutProjectIO.java (99%) rename src/main/java/org/mastodon/mamut/{ => io}/project/ReadZip.java (98%) rename src/main/java/org/mastodon/mamut/{ => io}/project/WriteZip.java (98%) rename src/main/java/org/mastodon/mamut/{ => io}/project/package-info.java (97%) diff --git a/src/main/java/org/mastodon/mamut/ProjectManager.java b/src/main/java/org/mastodon/mamut/ProjectManager.java index 0074164fc..9f236974b 100644 --- a/src/main/java/org/mastodon/mamut/ProjectManager.java +++ b/src/main/java/org/mastodon/mamut/ProjectManager.java @@ -33,8 +33,8 @@ import static org.mastodon.app.MastodonIcons.MAMUT_IMPORT_ICON_MEDIUM; import static org.mastodon.app.MastodonIcons.NEW_ICON_MEDIUM; import static org.mastodon.app.MastodonIcons.SAVE_ICON_MEDIUM; -import static org.mastodon.mamut.project.MamutProjectIO.MAMUTPROJECT_VERSION_ATTRIBUTE_CURRENT; -import static org.mastodon.mamut.project.MamutProjectIO.MAMUTPROJECT_VERSION_ATTRIBUTE_NAME; +import static org.mastodon.mamut.io.project.MamutProjectIO.MAMUTPROJECT_VERSION_ATTRIBUTE_CURRENT; +import static org.mastodon.mamut.io.project.MamutProjectIO.MAMUTPROJECT_VERSION_ATTRIBUTE_NAME; import java.awt.Component; import java.awt.event.WindowAdapter; @@ -74,14 +74,14 @@ import org.mastodon.mamut.importer.tgmm.TgmmImportDialog; import org.mastodon.mamut.importer.trackmate.MamutExporter; import org.mastodon.mamut.importer.trackmate.TrackMateImporter; +import org.mastodon.mamut.io.project.MamutImagePlusProject; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; +import org.mastodon.mamut.io.project.MamutProject.ProjectReader; +import org.mastodon.mamut.io.project.MamutProject.ProjectWriter; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutImagePlusProject; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProject.ProjectReader; -import org.mastodon.mamut.project.MamutProject.ProjectWriter; -import org.mastodon.mamut.project.MamutProjectIO; import org.mastodon.ui.keymap.CommandDescriptionProvider; import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; diff --git a/src/main/java/org/mastodon/mamut/feature/MamutPlayground.java b/src/main/java/org/mastodon/mamut/feature/MamutPlayground.java index c3bb5745e..e3827e4bf 100644 --- a/src/main/java/org/mastodon/mamut/feature/MamutPlayground.java +++ b/src/main/java/org/mastodon/mamut/feature/MamutPlayground.java @@ -39,11 +39,11 @@ import org.mastodon.feature.FeatureSpec; import org.mastodon.feature.FeatureSpecsService; import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; import org.scijava.Context; import mpicbg.spim.data.SpimDataException; diff --git a/src/main/java/org/mastodon/mamut/feature/MamutRawFeatureModelIO.java b/src/main/java/org/mastodon/mamut/feature/MamutRawFeatureModelIO.java index c5f5b4428..3be4f2430 100644 --- a/src/main/java/org/mastodon/mamut/feature/MamutRawFeatureModelIO.java +++ b/src/main/java/org/mastodon/mamut/feature/MamutRawFeatureModelIO.java @@ -49,6 +49,8 @@ import org.mastodon.io.FileIdToObjectMap; import org.mastodon.io.ObjectToFileIdMap; import org.mastodon.mamut.feature.branch.BranchFeatureSerializer; +import org.mastodon.mamut.io.project.MamutProject.ProjectReader; +import org.mastodon.mamut.io.project.MamutProject.ProjectWriter; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelGraph; @@ -56,8 +58,6 @@ import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; import org.mastodon.mamut.model.branch.ModelBranchGraph; -import org.mastodon.mamut.project.MamutProject.ProjectReader; -import org.mastodon.mamut.project.MamutProject.ProjectWriter; import org.scijava.Context; public class MamutRawFeatureModelIO diff --git a/src/main/java/org/mastodon/mamut/importer/tgmm/TgmmImporter.java b/src/main/java/org/mastodon/mamut/importer/tgmm/TgmmImporter.java index 664ba545e..435d1d56c 100644 --- a/src/main/java/org/mastodon/mamut/importer/tgmm/TgmmImporter.java +++ b/src/main/java/org/mastodon/mamut/importer/tgmm/TgmmImporter.java @@ -47,10 +47,10 @@ import org.mastodon.collection.RefMaps; import org.mastodon.graph.Graph; import org.mastodon.mamut.importer.ModelImporter; +import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutProject; import Jama.Matrix; import bdv.spimdata.SpimDataMinimal; diff --git a/src/main/java/org/mastodon/mamut/importer/trackmate/MamutExporter.java b/src/main/java/org/mastodon/mamut/importer/trackmate/MamutExporter.java index e119dd467..3d548a74f 100644 --- a/src/main/java/org/mastodon/mamut/importer/trackmate/MamutExporter.java +++ b/src/main/java/org/mastodon/mamut/importer/trackmate/MamutExporter.java @@ -130,10 +130,10 @@ import org.mastodon.graph.algorithm.traversal.DepthFirstSearch; import org.mastodon.graph.algorithm.traversal.GraphSearch.SearchDirection; import org.mastodon.graph.algorithm.traversal.SearchListener; +import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutProject; import org.mastodon.pool.PoolObject; import org.mastodon.spatial.SpatioTemporalIndex; import org.mastodon.views.bdv.overlay.util.JamaEigenvalueDecomposition; diff --git a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImporter.java b/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImporter.java index 13d9ac6dc..c24c9a5e5 100644 --- a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImporter.java +++ b/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImporter.java @@ -85,11 +85,11 @@ import org.mastodon.feature.FeatureModel; import org.mastodon.feature.FeatureSpecsService; import org.mastodon.mamut.importer.ModelImporter; +import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelGraph; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutProject; import org.mastodon.properties.DoublePropertyMap; import org.mastodon.properties.IntPropertyMap; diff --git a/src/main/java/org/mastodon/mamut/project/MamutImagePlusProject.java b/src/main/java/org/mastodon/mamut/io/project/MamutImagePlusProject.java similarity index 98% rename from src/main/java/org/mastodon/mamut/project/MamutImagePlusProject.java rename to src/main/java/org/mastodon/mamut/io/project/MamutImagePlusProject.java index b4ade70a1..3b8528460 100644 --- a/src/main/java/org/mastodon/mamut/project/MamutImagePlusProject.java +++ b/src/main/java/org/mastodon/mamut/io/project/MamutImagePlusProject.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.project; +package org.mastodon.mamut.io.project; import java.io.File; diff --git a/src/main/java/org/mastodon/mamut/project/MamutProject.java b/src/main/java/org/mastodon/mamut/io/project/MamutProject.java similarity index 99% rename from src/main/java/org/mastodon/mamut/project/MamutProject.java rename to src/main/java/org/mastodon/mamut/io/project/MamutProject.java index b1893bed8..82340323d 100644 --- a/src/main/java/org/mastodon/mamut/project/MamutProject.java +++ b/src/main/java/org/mastodon/mamut/io/project/MamutProject.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.project; +package org.mastodon.mamut.io.project; import java.io.Closeable; import java.io.File; diff --git a/src/main/java/org/mastodon/mamut/project/MamutProjectIO.java b/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java similarity index 99% rename from src/main/java/org/mastodon/mamut/project/MamutProjectIO.java rename to src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java index 05162ab7f..f6bd82c81 100644 --- a/src/main/java/org/mastodon/mamut/project/MamutProjectIO.java +++ b/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.project; +package org.mastodon.mamut.io.project; import java.io.File; import java.io.IOException; diff --git a/src/main/java/org/mastodon/mamut/project/ReadZip.java b/src/main/java/org/mastodon/mamut/io/project/ReadZip.java similarity index 98% rename from src/main/java/org/mastodon/mamut/project/ReadZip.java rename to src/main/java/org/mastodon/mamut/io/project/ReadZip.java index 844b45bfe..45dc1a927 100644 --- a/src/main/java/org/mastodon/mamut/project/ReadZip.java +++ b/src/main/java/org/mastodon/mamut/io/project/ReadZip.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.project; +package org.mastodon.mamut.io.project; import java.io.Closeable; import java.io.File; diff --git a/src/main/java/org/mastodon/mamut/project/WriteZip.java b/src/main/java/org/mastodon/mamut/io/project/WriteZip.java similarity index 98% rename from src/main/java/org/mastodon/mamut/project/WriteZip.java rename to src/main/java/org/mastodon/mamut/io/project/WriteZip.java index d02722b0e..e93c08753 100644 --- a/src/main/java/org/mastodon/mamut/project/WriteZip.java +++ b/src/main/java/org/mastodon/mamut/io/project/WriteZip.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.project; +package org.mastodon.mamut.io.project; import java.io.Closeable; import java.io.File; diff --git a/src/main/java/org/mastodon/mamut/project/package-info.java b/src/main/java/org/mastodon/mamut/io/project/package-info.java similarity index 97% rename from src/main/java/org/mastodon/mamut/project/package-info.java rename to src/main/java/org/mastodon/mamut/io/project/package-info.java index c20b5fd65..692a61d20 100644 --- a/src/main/java/org/mastodon/mamut/project/package-info.java +++ b/src/main/java/org/mastodon/mamut/io/project/package-info.java @@ -29,4 +29,4 @@ /** * Project IO for the MaMuT app of Mastodon. */ -package org.mastodon.mamut.project; +package org.mastodon.mamut.io.project; diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java index 0487145d6..268028b5e 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java @@ -30,9 +30,8 @@ import org.mastodon.mamut.MainWindow; import org.mastodon.mamut.WindowManager; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; - +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.io.IOPlugin; import org.scijava.io.AbstractIOPlugin; import org.scijava.io.location.FileLocation; diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java index 189a8a1ed..4b702cdb4 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java @@ -60,10 +60,10 @@ import org.mastodon.mamut.importer.simi.SimiImporter.LabelFunction; import org.mastodon.mamut.importer.tgmm.TgmmImporter; import org.mastodon.mamut.importer.trackmate.TrackMateImporter; +import org.mastodon.mamut.io.project.MamutImagePlusProject; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; -import org.mastodon.mamut.project.MamutImagePlusProject; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; import org.mastodon.ui.util.EverythingDisablerAndReenabler; import org.mastodon.ui.util.ExtensionFileFilter; import org.mastodon.ui.util.FileChooser; diff --git a/src/main/java/org/mastodon/mamut/model/Model.java b/src/main/java/org/mastodon/mamut/model/Model.java index f0f683e17..82459cee8 100644 --- a/src/main/java/org/mastodon/mamut/model/Model.java +++ b/src/main/java/org/mastodon/mamut/model/Model.java @@ -55,10 +55,10 @@ import org.mastodon.mamut.feature.SpotPositionFeature; import org.mastodon.mamut.feature.SpotRadiusFeature; import org.mastodon.mamut.feature.branch.BranchNDivisionsFeature; +import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; import org.mastodon.mamut.model.branch.ModelBranchGraph; -import org.mastodon.mamut.project.MamutProject; import org.mastodon.model.AbstractModel; import org.mastodon.model.tag.DefaultTagSetModel; import org.mastodon.model.tag.RawTagSetModelIO; diff --git a/src/main/java/org/mastodon/views/bdv/overlay/ui/DummyBdvPanel.java b/src/main/java/org/mastodon/views/bdv/overlay/ui/DummyBdvPanel.java index a331db3d9..c73b376d9 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/ui/DummyBdvPanel.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/ui/DummyBdvPanel.java @@ -54,13 +54,13 @@ import org.mastodon.graph.algorithm.traversal.DepthFirstSearch; import org.mastodon.graph.algorithm.traversal.GraphSearch.SearchDirection; import org.mastodon.graph.algorithm.traversal.SearchListener; +import org.mastodon.mamut.io.project.MamutProject.ProjectReader; import org.mastodon.mamut.model.BoundingSphereRadiusStatistics; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelGraph; import org.mastodon.mamut.model.ModelOverlayProperties; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutProject.ProjectReader; import org.mastodon.model.DefaultFocusModel; import org.mastodon.model.DefaultHighlightModel; import org.mastodon.model.DefaultSelectionModel; diff --git a/src/main/java/org/mastodon/views/grapher/display/GrapherSidePanel.java b/src/main/java/org/mastodon/views/grapher/display/GrapherSidePanel.java index b0fef4ab8..c22871d83 100644 --- a/src/main/java/org/mastodon/views/grapher/display/GrapherSidePanel.java +++ b/src/main/java/org/mastodon/views/grapher/display/GrapherSidePanel.java @@ -58,12 +58,12 @@ import org.mastodon.feature.Multiplicity; import org.mastodon.graph.io.RawGraphIO.FileIdToGraphMap; import org.mastodon.mamut.feature.MamutRawFeatureModelIO; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; +import org.mastodon.mamut.io.project.MamutProject.ProjectReader; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProject.ProjectReader; -import org.mastodon.mamut.project.MamutProjectIO; import org.mastodon.ui.context.ContextChooserPanel; import org.mastodon.ui.util.EverythingDisablerAndReenabler; import org.mastodon.util.FeatureUtils; diff --git a/src/test/java/org/mastodon/StartMastodonOnProject.java b/src/test/java/org/mastodon/StartMastodonOnProject.java index 0cef400c6..d2e127509 100644 --- a/src/test/java/org/mastodon/StartMastodonOnProject.java +++ b/src/test/java/org/mastodon/StartMastodonOnProject.java @@ -34,7 +34,7 @@ import mpicbg.spim.data.SpimDataException; import org.mastodon.mamut.MainWindow; import org.mastodon.mamut.WindowManager; -import org.mastodon.mamut.project.MamutProjectIO; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.Context; import java.io.IOException; diff --git a/src/test/java/org/mastodon/graph/BranchGraphExample.java b/src/test/java/org/mastodon/graph/BranchGraphExample.java index 34288210f..70ce5e39f 100644 --- a/src/test/java/org/mastodon/graph/BranchGraphExample.java +++ b/src/test/java/org/mastodon/graph/BranchGraphExample.java @@ -36,8 +36,8 @@ import org.mastodon.mamut.MainWindow; import org.mastodon.mamut.WindowManager; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.Context; public class BranchGraphExample diff --git a/src/test/java/org/mastodon/mamut/CloseListenerTest.java b/src/test/java/org/mastodon/mamut/CloseListenerTest.java index 506d41909..b00cd3734 100644 --- a/src/test/java/org/mastodon/mamut/CloseListenerTest.java +++ b/src/test/java/org/mastodon/mamut/CloseListenerTest.java @@ -35,8 +35,8 @@ import java.io.IOException; import org.junit.Test; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.Context; import mpicbg.spim.data.SpimDataException; diff --git a/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java b/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java index 7075d805b..2c9918e3a 100644 --- a/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java +++ b/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java @@ -36,9 +36,9 @@ import java.lang.ref.WeakReference; import org.junit.Test; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.ModelGraph; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; import org.mastodon.util.GarbageCollectionUtils; import org.scijava.Context; diff --git a/src/test/java/org/mastodon/mamut/ProjectManagerTest.java b/src/test/java/org/mastodon/mamut/ProjectManagerTest.java index e40d0f4e1..9e125129a 100644 --- a/src/test/java/org/mastodon/mamut/ProjectManagerTest.java +++ b/src/test/java/org/mastodon/mamut/ProjectManagerTest.java @@ -41,8 +41,8 @@ import mpicbg.spim.data.SpimDataException; import org.junit.Test; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.Context; /** diff --git a/src/test/java/org/mastodon/mamut/StartMastodonWithMissingImageDemo.java b/src/test/java/org/mastodon/mamut/StartMastodonWithMissingImageDemo.java index 47a124d57..c592c7ff9 100644 --- a/src/test/java/org/mastodon/mamut/StartMastodonWithMissingImageDemo.java +++ b/src/test/java/org/mastodon/mamut/StartMastodonWithMissingImageDemo.java @@ -33,7 +33,7 @@ import javax.swing.JLabel; import javax.swing.WindowConstants; -import org.mastodon.mamut.project.MamutProjectIO; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.Context; import net.miginfocom.swing.MigLayout; diff --git a/src/test/java/org/mastodon/mamut/feature/FeatureSerializerTestUtils.java b/src/test/java/org/mastodon/mamut/feature/FeatureSerializerTestUtils.java index 192eeecd6..278a98992 100644 --- a/src/test/java/org/mastodon/mamut/feature/FeatureSerializerTestUtils.java +++ b/src/test/java/org/mastodon/mamut/feature/FeatureSerializerTestUtils.java @@ -5,10 +5,10 @@ import org.mastodon.feature.FeatureProjectionKey; import org.mastodon.feature.FeatureSpec; import org.mastodon.graph.io.RawGraphIO; +import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutProject; import org.scijava.Context; import java.io.File; diff --git a/src/test/java/org/mastodon/mamut/feature/RawDeserializationExample.java b/src/test/java/org/mastodon/mamut/feature/RawDeserializationExample.java index 2cef13766..232cb6fd3 100644 --- a/src/test/java/org/mastodon/mamut/feature/RawDeserializationExample.java +++ b/src/test/java/org/mastodon/mamut/feature/RawDeserializationExample.java @@ -44,9 +44,9 @@ import org.mastodon.feature.FeatureModel; import org.mastodon.feature.FeatureSpec; import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; import org.scijava.Context; import mpicbg.spim.data.SpimDataException; diff --git a/src/test/java/org/mastodon/mamut/feature/SerializeFeatureExample.java b/src/test/java/org/mastodon/mamut/feature/SerializeFeatureExample.java index d950beab5..26b520341 100644 --- a/src/test/java/org/mastodon/mamut/feature/SerializeFeatureExample.java +++ b/src/test/java/org/mastodon/mamut/feature/SerializeFeatureExample.java @@ -40,10 +40,10 @@ import org.mastodon.feature.FeatureModel; import org.mastodon.feature.FeatureSpec; import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelUtils; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; import org.scijava.Context; import mpicbg.spim.data.SpimDataException; diff --git a/src/test/java/org/mastodon/mamut/feature/SpotIntensityBenchmark.java b/src/test/java/org/mastodon/mamut/feature/SpotIntensityBenchmark.java index c626614fd..1e0238ce0 100644 --- a/src/test/java/org/mastodon/mamut/feature/SpotIntensityBenchmark.java +++ b/src/test/java/org/mastodon/mamut/feature/SpotIntensityBenchmark.java @@ -32,10 +32,10 @@ import org.jdom2.JDOMException; import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; import org.scijava.Context; import mpicbg.spim.data.SpimDataException; diff --git a/src/test/java/org/mastodon/mamut/feature/SpotIntensityUpdateExample.java b/src/test/java/org/mastodon/mamut/feature/SpotIntensityUpdateExample.java index dfcc0ce79..e5912112e 100644 --- a/src/test/java/org/mastodon/mamut/feature/SpotIntensityUpdateExample.java +++ b/src/test/java/org/mastodon/mamut/feature/SpotIntensityUpdateExample.java @@ -39,10 +39,10 @@ import org.mastodon.feature.FeatureProjection; import org.mastodon.feature.FeatureSpec; import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; import org.scijava.Context; import mpicbg.spim.data.SpimDataException; diff --git a/src/test/java/org/mastodon/mamut/feature/ui/FeatureColorModeConfigPageDemo.java b/src/test/java/org/mastodon/mamut/feature/ui/FeatureColorModeConfigPageDemo.java index 7bd5696e8..ce3b3ead4 100644 --- a/src/test/java/org/mastodon/mamut/feature/ui/FeatureColorModeConfigPageDemo.java +++ b/src/test/java/org/mastodon/mamut/feature/ui/FeatureColorModeConfigPageDemo.java @@ -36,9 +36,9 @@ import org.mastodon.feature.ui.FeatureColorModeConfigPage; import org.mastodon.mamut.PreferencesDialog; import org.mastodon.mamut.feature.MamutFeatureProjectionsManager; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.ui.keymap.Keymap; diff --git a/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java b/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java index 1a480e1f7..88f5497db 100644 --- a/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java +++ b/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java @@ -44,10 +44,10 @@ import org.mastodon.mamut.feature.TrackSizeFeature; import org.mastodon.mamut.importer.trackmate.MamutExporter; import org.mastodon.mamut.importer.trackmate.TrackMateImporter; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelUtils; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; import org.scijava.Context; import mpicbg.spim.data.SpimDataException; diff --git a/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java b/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java index 11297c1c1..ca8a8d724 100644 --- a/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java +++ b/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java @@ -37,9 +37,9 @@ import org.mastodon.mamut.WindowManager; import org.mastodon.mamut.importer.trackmate.TrackMateImporter; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelUtils; -import org.mastodon.mamut.project.MamutProjectIO; import org.scijava.Context; import mpicbg.spim.data.SpimDataException; diff --git a/src/test/java/org/mastodon/mamut/importer/TrackMateImporterTest.java b/src/test/java/org/mastodon/mamut/importer/TrackMateImporterTest.java index 5a179f696..9e4331806 100644 --- a/src/test/java/org/mastodon/mamut/importer/TrackMateImporterTest.java +++ b/src/test/java/org/mastodon/mamut/importer/TrackMateImporterTest.java @@ -57,12 +57,12 @@ import org.mastodon.mamut.importer.trackmate.TrackMateImportedLinkFeatures; import org.mastodon.mamut.importer.trackmate.TrackMateImportedSpotFeatures; import org.mastodon.mamut.importer.trackmate.TrackMateImportedSpotFeatures.Spec; +import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.importer.trackmate.TrackMateImporter; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelGraph; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutProject; import org.scijava.Context; public class TrackMateImporterTest diff --git a/src/test/java/org/mastodon/mamut/importer/trackmate/MaMuTExporterTest.java b/src/test/java/org/mastodon/mamut/importer/trackmate/MaMuTExporterTest.java index 135136e03..8ea178d0a 100644 --- a/src/test/java/org/mastodon/mamut/importer/trackmate/MaMuTExporterTest.java +++ b/src/test/java/org/mastodon/mamut/importer/trackmate/MaMuTExporterTest.java @@ -63,11 +63,11 @@ import org.mastodon.graph.io.RawGraphIO; import org.mastodon.mamut.feature.MamutFeatureComputerService; import org.mastodon.mamut.feature.MamutRawFeatureModelIO; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; import org.mastodon.views.bdv.SharedBigDataViewerData; import org.scijava.Context; diff --git a/src/test/java/org/mastodon/mamut/project/MamutProjectIOTest.java b/src/test/java/org/mastodon/mamut/project/MamutProjectIOTest.java index 21c935a3a..8fe351047 100644 --- a/src/test/java/org/mastodon/mamut/project/MamutProjectIOTest.java +++ b/src/test/java/org/mastodon/mamut/project/MamutProjectIOTest.java @@ -34,6 +34,8 @@ import java.io.IOException; import org.junit.Test; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; public class MamutProjectIOTest { diff --git a/src/test/java/org/mastodon/mamut/tags/PlayingWithTagsExample.java b/src/test/java/org/mastodon/mamut/tags/PlayingWithTagsExample.java index 36efc1a4a..5d0bcbe95 100644 --- a/src/test/java/org/mastodon/mamut/tags/PlayingWithTagsExample.java +++ b/src/test/java/org/mastodon/mamut/tags/PlayingWithTagsExample.java @@ -4,10 +4,10 @@ import java.util.Collection; import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutProjectIO; import org.mastodon.model.tag.TagSetModel; import org.mastodon.model.tag.TagSetStructure; import org.mastodon.model.tag.TagSetStructure.Tag; diff --git a/src/test/java/org/mastodon/util/MastodonUtils.java b/src/test/java/org/mastodon/util/MastodonUtils.java index 88d78e198..857088a99 100644 --- a/src/test/java/org/mastodon/util/MastodonUtils.java +++ b/src/test/java/org/mastodon/util/MastodonUtils.java @@ -38,12 +38,12 @@ import org.mastodon.mamut.MamutAppModel; import org.mastodon.mamut.WindowManager; import org.mastodon.mamut.feature.MamutRawFeatureModelIO; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelGraph; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.project.MamutProject; -import org.mastodon.mamut.project.MamutProjectIO; import org.mastodon.model.FocusModel; import org.mastodon.model.NavigationHandler; import org.mastodon.model.NavigationListener; From 3dc7622d893e83f0c63e6052c836cab5200b7b91 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Wed, 9 Aug 2023 09:57:48 +0200 Subject: [PATCH 002/220] MamutProjectIO has only static methods now. --- .../mamut/io/project/MamutProjectIO.java | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java b/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java index f6bd82c81..30d7fb80d 100644 --- a/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java +++ b/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java @@ -38,11 +38,13 @@ import org.jdom2.input.SAXBuilder; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; +import org.mastodon.io.IOUtils; import mpicbg.spim.data.XmlHelpers; public class MamutProjectIO { + public static final String MAMUTPROJECT_TAG = "MamutProject"; public static final String MAMUTPROJECT_VERSION_ATTRIBUTE_NAME = "version"; @@ -55,17 +57,17 @@ public class MamutProjectIO private static final String TIME_UNITS_TAG = "TimeUnits"; - public void save( final MamutProject project, final MamutProject.ProjectWriter writer ) throws IOException + public static final void save( final MamutProject project, final MamutProject.ProjectWriter writer ) throws IOException { final Document doc = new Document( toXml( project ) ); final XMLOutputter xout = new XMLOutputter( Format.getPrettyFormat() ); - mkdirs( project.getProjectRoot().getParentFile().getAbsolutePath() ); + IOUtils.mkdirs( project.getProjectRoot().getParentFile().getAbsolutePath() ); final OutputStream os = writer.getProjectXmlOutputStream(); xout.output( doc, os ); os.close(); } - public MamutProject load( final String projectPath ) throws IOException + public static final MamutProject load( final String projectPath ) throws IOException { final MamutProject project = new MamutProject( projectPath ); @@ -89,7 +91,7 @@ public MamutProject load( final String projectPath ) throws IOException return project; } - public Element toXml( final MamutProject project ) + public static final Element toXml( final MamutProject project ) { final Element root = new Element( MAMUTPROJECT_TAG ); root.setAttribute( MAMUTPROJECT_VERSION_ATTRIBUTE_NAME, MAMUTPROJECT_VERSION_ATTRIBUTE_CURRENT ); @@ -100,7 +102,7 @@ public Element toXml( final MamutProject project ) return root; } - public void fromXml( final MamutProject project, final Element root ) + public static final void fromXml( final MamutProject project, final Element root ) { project.setDatasetXmlFile( getDatasetPathFromXml( project, root ) ); final boolean datasetXmlPathRelative = XmlHelpers.isPathRelative( root, SPIMDATAFILE_TAG ); @@ -111,7 +113,7 @@ public void fromXml( final MamutProject project, final Element root ) project.setTimeUnits( timeUnits ); } - private File getDatasetPathFromXml( MamutProject project, Element root ) + private static final File getDatasetPathFromXml( final MamutProject project, final Element root ) { File datasetXml = XmlHelpers.loadPath( root, SPIMDATAFILE_TAG, project.getProjectRoot() ); datasetXml = new File( datasetXml.getPath().replace( "\\", "/" ) ); @@ -119,18 +121,12 @@ private File getDatasetPathFromXml( MamutProject project, Element root ) return datasetXml; } - public static boolean mkdirs( final String fileName ) - { - final File dir = new File( fileName ); - return dir == null ? false : dir.mkdirs(); - } - public static void main( final String[] args ) { final String projectFolder = "samples/mamutproject"; try { - final MamutProject mamutProject = new MamutProjectIO().load( projectFolder ); + final MamutProject mamutProject = MamutProjectIO.load( projectFolder ); System.out.println( mamutProject ); } catch ( final IOException e ) From c94521d297d3fed4071e6e3523b08e8f06fa0830 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Tue, 15 Aug 2023 23:15:43 +0200 Subject: [PATCH 003/220] WIP: rework the app model and the project IO. --- .../org/mastodon/app/MastodonAppModel.java | 6 + .../org/mastodon/mamut/MamutAppModel.java | 112 ++- .../org/mastodon/mamut/MamutBranchView.java | 7 +- .../mastodon/mamut/MamutBranchViewBdv.java | 10 +- .../mamut/MamutBranchViewTrackScheme.java | 14 +- .../java/org/mastodon/mamut/MamutView.java | 67 +- .../java/org/mastodon/mamut/MamutViewBdv.java | 27 +- .../org/mastodon/mamut/MamutViewGrapher.java | 24 +- .../mamut/MamutViewStateSerialization.java | 885 ------------------ .../org/mastodon/mamut/MamutViewTable.java | 65 +- .../mastodon/mamut/MamutViewTrackScheme.java | 18 +- .../org/mastodon/mamut/ProjectManager.java | 19 +- .../org/mastodon/mamut/WindowManager.java | 306 ++---- .../mamut/io/project/MamutProjectIO.java | 64 ++ .../mamut/launcher/MastodonLauncher.java | 15 +- .../mastodon/mamut/plugin/MamutPlugin.java | 3 +- .../mamut/plugin/MamutPluginAppModel.java | 56 -- .../mastodon/mamut/plugin/MamutPlugins.java | 3 +- .../mamut/plugin/MamutTestPlugin.java | 10 +- .../mamut/importer/MaMuTImporterExample.java | 7 +- 20 files changed, 416 insertions(+), 1302 deletions(-) delete mode 100644 src/main/java/org/mastodon/mamut/MamutViewStateSerialization.java delete mode 100644 src/main/java/org/mastodon/mamut/plugin/MamutPluginAppModel.java diff --git a/src/main/java/org/mastodon/app/MastodonAppModel.java b/src/main/java/org/mastodon/app/MastodonAppModel.java index 294ab00f6..4eae0006b 100644 --- a/src/main/java/org/mastodon/app/MastodonAppModel.java +++ b/src/main/java/org/mastodon/app/MastodonAppModel.java @@ -216,6 +216,7 @@ public KeymapManager getKeymapManager() /** * Actions that should be available in all views. * + * * @return the application actions. */ public Actions getAppActions() @@ -226,6 +227,11 @@ public Actions getAppActions() /** * Actions that are always available, even if no {@link MastodonAppModel} * currently exists. + * + * TODO: naming, this should be named appActions and the AppModel.appActions + * should become modelActions? + * + * TODO: or rename AppModel --> ProjectModel, then projectActions? * * @return the global actions. */ diff --git a/src/main/java/org/mastodon/mamut/MamutAppModel.java b/src/main/java/org/mastodon/mamut/MamutAppModel.java index a271facf6..c1b737080 100644 --- a/src/main/java/org/mastodon/mamut/MamutAppModel.java +++ b/src/main/java/org/mastodon/mamut/MamutAppModel.java @@ -28,22 +28,27 @@ */ package org.mastodon.mamut; +import java.util.List; + import org.mastodon.app.MastodonAppModel; -import org.mastodon.mamut.feature.MamutFeatureProjectionsManager; +import org.mastodon.app.plugin.MastodonAppPluginModel; import org.mastodon.mamut.model.BoundingSphereRadiusStatistics; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; import org.mastodon.mamut.model.branch.BranchGraphSynchronizer; +import org.mastodon.mamut.plugin.MamutPlugin; import org.mastodon.mamut.plugin.MamutPlugins; -import org.mastodon.ui.coloring.feature.FeatureColorModeManager; +import org.mastodon.ui.SelectionActions; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.Keymap; import org.mastodon.ui.keymap.KeymapManager; import org.mastodon.views.bdv.SharedBigDataViewerData; -import org.mastodon.views.bdv.overlay.ui.RenderSettingsManager; -import org.mastodon.views.grapher.display.style.DataDisplayStyleManager; -import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleManager; +import org.scijava.Context; +import org.scijava.InstantiableException; import org.scijava.listeners.Listeners; +import org.scijava.plugin.PluginInfo; +import org.scijava.plugin.PluginService; import org.scijava.ui.behaviour.KeyPressedManager; import org.scijava.ui.behaviour.util.Actions; @@ -53,7 +58,7 @@ * * @author Jean-Yves Tinevez */ -public class MamutAppModel extends MastodonAppModel< Model, Spot, Link > +public class MamutAppModel extends MastodonAppModel< Model, Spot, Link > implements MastodonAppPluginModel { private static final int NUM_GROUPS = 3; @@ -61,14 +66,6 @@ public class MamutAppModel extends MastodonAppModel< Model, Spot, Link > private final SharedBigDataViewerData sharedBdvData; - private final TrackSchemeStyleManager trackSchemeStyleManager; - - private final DataDisplayStyleManager dataDisplayStyleManager; - - private final RenderSettingsManager renderSettingsManager; - - private final FeatureColorModeManager featureColorModeManager; - private final int minTimepoint; private final int maxTimepoint; @@ -77,41 +74,39 @@ public class MamutAppModel extends MastodonAppModel< Model, Spot, Link > private final Listeners.List< CloseListener > closeListeners = new Listeners.List<>(); - private final MamutFeatureProjectionsManager featureProjectionsManager; + private final WindowManager windowManager; + + private final Context context; public MamutAppModel( + final Context context, final Model model, final SharedBigDataViewerData sharedBdvData, final KeyPressedManager keyPressedManager, - final TrackSchemeStyleManager trackSchemeStyleManager, - final DataDisplayStyleManager dataDisplayStyleManager, - final RenderSettingsManager renderSettingsManager, - final FeatureColorModeManager featureColorModeManager, - final MamutFeatureProjectionsManager featureProjectionsManager, - final KeymapManager keymapManager, - final MamutPlugins plugins, - final Actions globalActions ) + final KeymapManager keymapManager ) { super( NUM_GROUPS, model, keyPressedManager, keymapManager, - plugins, - globalActions, + new MamutPlugins( keymapManager.getForwardDefaultKeymap() ), + new Actions( keymapManager.getForwardDefaultKeymap().getConfig(), KeyConfigContexts.MASTODON ), new String[] { KeyConfigContexts.MASTODON } ); + this.context = context; this.radiusStats = new BoundingSphereRadiusStatistics( model ); this.sharedBdvData = sharedBdvData; - this.trackSchemeStyleManager = trackSchemeStyleManager; - this.dataDisplayStyleManager = dataDisplayStyleManager; - this.renderSettingsManager = renderSettingsManager; - this.featureColorModeManager = featureColorModeManager; - this.featureProjectionsManager = featureProjectionsManager; this.minTimepoint = 0; this.maxTimepoint = sharedBdvData.getNumTimepoints() - 1; - this.branchGraphSync = - new BranchGraphSynchronizer( model.getBranchGraph(), model.getGraph().getLock().readLock() ); + + final Keymap keymap = keymapManager.getForwardDefaultKeymap(); + keymap.updateListeners().add( () -> { + getGlobalActions().updateKeyConfig( keymap.getConfig() ); + getAppActions().updateKeyConfig( keymap.getConfig() ); + } ); + + this.branchGraphSync = new BranchGraphSynchronizer( model.getBranchGraph(), model.getGraph().getLock().readLock() ); model.getGraph().addGraphChangeListener( branchGraphSync ); /* * TODO: (?) For now, we use timepoint indices in MaMuT model, instead @@ -119,31 +114,28 @@ public MamutAppModel( * it would be confusing to have different labels in TrackScheme. If * this is changed in the future, then probably only in the model files. */ - } - public DataDisplayStyleManager getDataDisplayStyleManager() - { - return dataDisplayStyleManager; - } + // WindowManager. + this.windowManager = new WindowManager( this ); - public TrackSchemeStyleManager getTrackSchemeStyleManager() - { - return trackSchemeStyleManager; - } + // Plugins. + discoverPlugins(); - public RenderSettingsManager getRenderSettingsManager() - { - return renderSettingsManager; + + // Install common actions. + UndoActions.install( getAppActions(), model ); + SelectionActions.install( getAppActions(), model.getGraph(), model.getGraph().getLock(), model.getGraph(), getSelectionModel(), model ); + MamutActions.install( getAppActions(), this ); } - public FeatureColorModeManager getFeatureColorModeManager() + public WindowManager getWindowManager() { - return featureColorModeManager; + return windowManager; } - public MamutFeatureProjectionsManager getFeatureProjectionsManager() + public Context getContext() { - return featureProjectionsManager; + return context; } public BoundingSphereRadiusStatistics getRadiusStats() @@ -183,4 +175,28 @@ public Listeners< CloseListener > projectClosedListeners() { return closeListeners; } + + private void discoverPlugins() + { + if ( context == null ) + return; + + final PluginService pluginService = context.getService( PluginService.class ); + final List< PluginInfo< MamutPlugin > > infos = pluginService.getPluginsOfType( MamutPlugin.class ); + final MamutPlugins plugins = ( MamutPlugins ) getPlugins(); + for ( final PluginInfo< MamutPlugin > info : infos ) + { + try + { + final MamutPlugin plugin = info.createInstance(); + context.inject( plugin ); + plugins.register( plugin ); + } + catch ( final InstantiableException e ) + { + e.printStackTrace(); + } + } + plugins.setAppPluginModel( this ); + } } diff --git a/src/main/java/org/mastodon/mamut/MamutBranchView.java b/src/main/java/org/mastodon/mamut/MamutBranchView.java index b990779ba..768b02414 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchView.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchView.java @@ -37,7 +37,6 @@ import javax.swing.JRadioButtonMenuItem; import javax.swing.JSeparator; -import org.mastodon.adapter.FadingModelAdapter; import org.mastodon.adapter.FocusModelAdapter; import org.mastodon.adapter.HighlightModelAdapter; import org.mastodon.adapter.NavigationHandlerAdapter; @@ -95,6 +94,12 @@ public class MamutBranchView< implements IMastodonFrameView, IMastodonView { + /** + * Key that specifies settings specific to the branch-graph view in a common + * view. Values are Map. + */ + public static final String BRANCH_GRAPH = "BranchGraph"; + protected final MamutAppModel appModel; protected ViewFrame frame; diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java index 61be9baa1..08f68f214 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java @@ -36,8 +36,8 @@ import static org.mastodon.mamut.MamutMenuBuilder.fileMenu; import static org.mastodon.mamut.MamutMenuBuilder.tagSetMenu; import static org.mastodon.mamut.MamutMenuBuilder.viewMenu; -import static org.mastodon.mamut.MamutViewStateSerialization.BDV_STATE_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.BDV_TRANSFORM_KEY; +import static org.mastodon.mamut.MamutViewBdv.BDV_STATE_KEY; +import static org.mastodon.mamut.MamutViewBdv.BDV_TRANSFORM_KEY; import java.util.HashMap; import java.util.Map; @@ -280,17 +280,17 @@ public MamutBranchViewBdv( final MamutAppModel appModel, final Map< String, Obje viewerFrame.setVisible( true ); } - ColoringModel getColoringModel() + public ColoringModel getColoringModel() { return coloringModel; } - ColorBarOverlay getColorBarOverlay() + public ColorBarOverlay getColorBarOverlay() { return colorBarOverlay; } - ViewerPanel getViewerPanelMamut() + public ViewerPanel getViewerPanelMamut() { return viewer; } diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java index 8cdab8e23..33b6f359b 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java @@ -35,8 +35,8 @@ import static org.mastodon.mamut.MamutMenuBuilder.editMenu; import static org.mastodon.mamut.MamutMenuBuilder.tagSetMenu; import static org.mastodon.mamut.MamutMenuBuilder.viewMenu; -import static org.mastodon.mamut.MamutViewStateSerialization.FRAME_POSITION_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.TRACKSCHEME_TRANSFORM_KEY; +import static org.mastodon.mamut.MamutView.FRAME_POSITION_KEY; +import static org.mastodon.mamut.MamutViewTrackScheme.TRACKSCHEME_TRANSFORM_KEY; import java.util.HashMap; import java.util.Map; @@ -187,7 +187,7 @@ protected MamutBranchViewTrackScheme( frame.getTrackschemePanel().getScreenTransform().set( tLoaded ); // Timepoint and number of spots. - TimepointAndNumberOfSpotsPanel timepointAndNumberOfSpotsPanel = + final TimepointAndNumberOfSpotsPanel timepointAndNumberOfSpotsPanel = new TimepointAndNumberOfSpotsPanel( this.timepointModel, model ); frame.getSettingsPanel().add( timepointAndNumberOfSpotsPanel ); @@ -371,13 +371,13 @@ public TrackSchemeGraph< BranchSpot, BranchLink > createViewGraph( final MamutAp { @Override - public String getFirstLabel( BranchSpot branchSpot ) + public String getFirstLabel( final BranchSpot branchSpot ) { return branchSpot.getFirstLabel(); } @Override - public int getFirstTimePoint( BranchSpot branchSpot ) + public int getFirstTimePoint( final BranchSpot branchSpot ) { return branchSpot.getFirstTimePoint(); } @@ -389,12 +389,12 @@ public int getFirstTimePoint( BranchSpot branchSpot ) } - ColoringModel getColoringModel() + public ColoringModel getColoringModel() { return coloringModel; } - ColorBarOverlay getColorBarOverlay() + public ColorBarOverlay getColorBarOverlay() { return colorBarOverlay; } diff --git a/src/main/java/org/mastodon/mamut/MamutView.java b/src/main/java/org/mastodon/mamut/MamutView.java index 8c73083c0..ad3a92e2a 100644 --- a/src/main/java/org/mastodon/mamut/MamutView.java +++ b/src/main/java/org/mastodon/mamut/MamutView.java @@ -28,15 +28,6 @@ */ package org.mastodon.mamut; -import static org.mastodon.mamut.MamutViewStateSerialization.COLORBAR_POSITION_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.COLORBAR_VISIBLE_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.FEATURE_COLOR_MODE_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.FRAME_POSITION_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.GROUP_HANDLE_ID_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.NO_COLORING_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.SETTINGS_PANEL_VISIBLE_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.TAG_SET_KEY; - import java.awt.Window; import java.util.ArrayList; import java.util.List; @@ -78,6 +69,64 @@ public class MamutView< VG extends ViewGraph< Spot, Link, V, E >, V extends Vertex< E >, E extends Edge< V > > extends MastodonFrameView< MamutAppModel, VG, Spot, Link, V, E > { + + /** + * Key that specifies whether the colorbar is visible. + */ + public static final String COLORBAR_VISIBLE_KEY = "ColorbarVisible"; + + /** + * Key that specifies the colorbar position. Values are {@link Position} + * enum values. + */ + public static final String COLORBAR_POSITION_KEY = "ColorbarPosition"; + + /** + * Key that specifies the name of the feature color mode to use for coloring + * scheme based on feature color modes. A non-null value means + * the coloring scheme is based on feature values. + * + * @see #NO_COLORING_KEY + * @see #TAG_SET_KEY + */ + public static final String FEATURE_COLOR_MODE_KEY = "FeatureColorMode"; + + /** + * Key that specifies whether we do not use a special coloring scheme on the + * view. If true, then we do not use a special coloring scheme. + * + * @see #TAG_SET_KEY + * @see #FEATURE_COLOR_MODE_KEY + */ + public static final String NO_COLORING_KEY = "NoColoring"; + + /** + * Key that specifies the name of the tag-set to use for coloring scheme + * based on tag-sets. A non-null value means the coloring + * scheme is based on tag-sets. + * + * @see #NO_COLORING_KEY + * @see #FEATURE_COLOR_MODE_KEY + */ + public static final String TAG_SET_KEY = "TagSet"; + + /** + * Key to the parameter that stores the frame position for + * {@link MastodonFrameView}s. Value is an int[] array of 4 + * elements: x, y, width and height. + */ + public static final String FRAME_POSITION_KEY = "FramePosition"; + + /** + * Key that specifies whether the settings panel is visible or not. + */ + public static final String SETTINGS_PANEL_VISIBLE_KEY = "SettingsPanelVisible"; + + /** + * Key to the lock group id. Value is an int. + */ + public static final String GROUP_HANDLE_ID_KEY = "LockGroupId"; + public MamutView( final MamutAppModel appModel, final VG viewGraph, final String[] keyConfigContexts ) { super( appModel, viewGraph, keyConfigContexts ); diff --git a/src/main/java/org/mastodon/mamut/MamutViewBdv.java b/src/main/java/org/mastodon/mamut/MamutViewBdv.java index 5271dabee..f7752c7eb 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutViewBdv.java @@ -36,8 +36,6 @@ import static org.mastodon.mamut.MamutMenuBuilder.fileMenu; import static org.mastodon.mamut.MamutMenuBuilder.tagSetMenu; import static org.mastodon.mamut.MamutMenuBuilder.viewMenu; -import static org.mastodon.mamut.MamutViewStateSerialization.BDV_STATE_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.BDV_TRANSFORM_KEY; import java.util.HashMap; import java.util.Map; @@ -99,11 +97,28 @@ import bdv.viewer.Source; import bdv.viewer.SourceAndConverter; import bdv.viewer.ViewerPanel; +import bdv.viewer.ViewerState; import net.imglib2.realtransform.AffineTransform3D; public class MamutViewBdv extends MamutView< OverlayGraphWrapper< Spot, Link >, OverlayVertexWrapper< Spot, Link >, OverlayEdgeWrapper< Spot, Link > > { + + /** + * Key for the {@link ViewerState} in a BDV view. Value is a XML + * {@link Element} serialized from the state. + * + * @see ViewerPanelMamut#stateToXml() + * @see ViewerPanelMamut#stateFromXml(Element) + */ + public static final String BDV_STATE_KEY = "BdvState"; + + /** + * Key for the transform in a BDV view. Value is an + * {@link AffineTransform3D} instance. + */ + public static final String BDV_TRANSFORM_KEY = "BdvTransform"; + // TODO private static int bdvName = 1; @@ -351,12 +366,12 @@ public MamutViewBdv( final MamutAppModel appModel, final Map< String, Object > g coloring ); } - ContextProvider< Spot > getContextProvider() + public ContextProvider< Spot > getContextProvider() { return contextProvider; } - ViewerPanel getViewerPanelMamut() + public ViewerPanel getViewerPanelMamut() { return viewer; } @@ -366,12 +381,12 @@ void requestRepaint() viewer.requestRepaint(); } - ColoringModelMain< Spot, Link, BranchSpot, BranchLink > getColoringModel() + public ColoringModelMain< Spot, Link, BranchSpot, BranchLink > getColoringModel() { return coloringModel; } - ColorBarOverlay getColorBarOverlay() + public ColorBarOverlay getColorBarOverlay() { return colorBarOverlay; } diff --git a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java index 5fc99d445..b67d87122 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java +++ b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java @@ -35,15 +35,6 @@ import static org.mastodon.mamut.MamutMenuBuilder.editMenu; import static org.mastodon.mamut.MamutMenuBuilder.tagSetMenu; import static org.mastodon.mamut.MamutMenuBuilder.viewMenu; -import static org.mastodon.mamut.MamutViewStateSerialization.COLORBAR_POSITION_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.COLORBAR_VISIBLE_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.FEATURE_COLOR_MODE_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.FRAME_POSITION_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.GRAPHER_TRANSFORM_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.GROUP_HANDLE_ID_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.NO_COLORING_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.SETTINGS_PANEL_VISIBLE_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.TAG_SET_KEY; import java.util.ArrayList; import java.util.HashMap; @@ -96,6 +87,13 @@ public class MamutViewGrapher extends MamutView< DataGraph< Spot, Link >, DataVertex, DataEdge > { + + /** + * Key for the transform in a Grapher view. Value is a Grapher + * ScreenTransform instance. + */ + public static final String GRAPHER_TRANSFORM_KEY = "GrapherTransform"; + private final ContextChooser< Spot > contextChooser; /** @@ -324,22 +322,22 @@ else if ( null != featureColorModeName ) dataDisplayPanel.getDisplay().requestFocusInWindow(); } - ContextChooser< Spot > getContextChooser() + public ContextChooser< Spot > getContextChooser() { return contextChooser; } - DataDisplayPanel< Spot, Link > getDataDisplayPanel() + public DataDisplayPanel< Spot, Link > getDataDisplayPanel() { return dataDisplayPanel; } - ColoringModelMain< Spot, Link, BranchSpot, BranchLink > getColoringModel() + public ColoringModelMain< Spot, Link, BranchSpot, BranchLink > getColoringModel() { return coloringModel; } - ColorBarOverlay getColorBarOverlay() + public ColorBarOverlay getColorBarOverlay() { return colorbarOverlay; } diff --git a/src/main/java/org/mastodon/mamut/MamutViewStateSerialization.java b/src/main/java/org/mastodon/mamut/MamutViewStateSerialization.java deleted file mode 100644 index b124732db..000000000 --- a/src/main/java/org/mastodon/mamut/MamutViewStateSerialization.java +++ /dev/null @@ -1,885 +0,0 @@ -/*- - * #%L - * Mastodon - * %% - * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ -package org.mastodon.mamut; - -import java.awt.GraphicsDevice; -import java.awt.GraphicsEnvironment; -import java.awt.Point; -import java.awt.Rectangle; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import javax.swing.JViewport; - -import org.jdom2.Element; -import org.mastodon.app.IMastodonView; -import org.mastodon.app.ui.IMastodonFrameView; -import org.mastodon.app.ui.MastodonFrameView; -import org.mastodon.mamut.model.Link; -import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.model.branch.BranchLink; -import org.mastodon.mamut.model.branch.BranchSpot; -import org.mastodon.ui.coloring.ColoringModel; -import org.mastodon.ui.coloring.ColoringModelMain; -import org.mastodon.views.context.ContextChooser; -import org.mastodon.views.context.ContextProvider; -import org.mastodon.views.grapher.display.DataDisplayPanel; -import org.mastodon.views.table.FeatureTagTablePanel; -import org.mastodon.views.trackscheme.ScreenTransform; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; -import org.mastodon.views.trackscheme.display.ColorBarOverlay.Position; -import org.mastodon.views.trackscheme.display.TrackSchemePanel; - -import bdv.viewer.ViewerState; -import mpicbg.spim.data.XmlHelpers; -import net.imglib2.realtransform.AffineGet; -import net.imglib2.realtransform.AffineTransform3D; - -/** - * Collection of constants and utilities related to de/serializing a GUI state. - */ -class MamutViewStateSerialization -{ - - static final String WINDOW_TAG = "Window"; - - /** - * Key to the view type name. Value is a string. - */ - static final String VIEW_TYPE_KEY = "Type"; - - /** - * Key to the parameter that stores the frame position for - * {@link MastodonFrameView}s. Value is an int[] array of 4 - * elements: x, y, width and height. - */ - static final String FRAME_POSITION_KEY = "FramePosition"; - - /** - * Key that specifies whether the settings panel is visible or not. - */ - static final String SETTINGS_PANEL_VISIBLE_KEY = "SettingsPanelVisible"; - - /** - * Key to the lock group id. Value is an int. - */ - static final String GROUP_HANDLE_ID_KEY = "LockGroupId"; - - /** - * Key for the {@link ViewerState} in a BDV view. Value is a XML - * {@link Element} serialized from the state. - * - * @see ViewerPanelMamut#stateToXml() - * @see ViewerPanelMamut#stateFromXml(Element) - */ - static final String BDV_STATE_KEY = "BdvState"; - - /** - * Key for the transform in a BDV view. Value is an - * {@link AffineTransform3D} instance. - */ - static final String BDV_TRANSFORM_KEY = "BdvTransform"; - - /** - * Key for the transform in a TrackScheme view. Value is a - * {@link ScreenTransform} instance. - */ - static final String TRACKSCHEME_TRANSFORM_KEY = "TrackSchemeTransform"; - - /** - * Key for the transform in a Grapher view. Value is a Grapher - * ScreenTransform instance. - */ - static final String GRAPHER_TRANSFORM_KEY = "GrapherTransform"; - - /** - * Key that specifies whether a table only display the selection or the - * whole model. Boolean instance. - */ - static final String TABLE_SELECTION_ONLY = "TableSelectionOnly"; - - /** - * Key that specifies whether a table is currently showing the vertex table. - * If false, then the edge table is displayed. - */ - static final String TABLE_DISPLAYING_VERTEX_TABLE = "TableVertexTableDisplayed"; - - /** - * Key that specifies what table is currently showing in the table view. - * Values are String that points to a tab name in the tabbed - * pane. - */ - static final String TABLE_DISPLAYED = "TableDisplayed"; - - /** - * Key to the parameter that stores the vertex table displayed rectangle. - * Value is and int[] array of 4 elements: x, y, width and - * height. - */ - static final String TABLE_VERTEX_TABLE_VISIBLE_POS = "TableVertexTableVisibleRect"; - - /** - * Key to the parameter that stores the table displayed position. Value is - * and int[] array of 2 elements: x, y. - */ - static final String TABLE_VISIBLE_POS = "TableVisibleRect"; - - /** - * Key to the parameter that stores the GUI states of multiple tables. Value - * is a List>. - */ - static final String TABLE_ELEMENT = "Tables"; - - /** - * Key to the parameter that stores the table name in a table GUI state. - * Value is a String. - */ - static final String TABLE_NAME = "TableName"; - - /** - * Key to the parameter that stores the edge table displayed rectangle. - * Value is and int[] array of 4 elements: x, y, width and - * height. - */ - static final String TABLE_EDGE_TABLE_VISIBLE_POS = "TableEdgeTableVisibleRect"; - - /** - * Key that specifies whether we do not use a special coloring scheme on the - * view. If true, then we do not use a special coloring scheme. - * - * @see #TAG_SET_KEY - * @see #FEATURE_COLOR_MODE_KEY - */ - static final String NO_COLORING_KEY = "NoColoring"; - - /** - * Key that specifies the name of the tag-set to use for coloring scheme - * based on tag-sets. A non-null value means the coloring - * scheme is based on tag-sets. - * - * @see #NO_COLORING_KEY - * @see #FEATURE_COLOR_MODE_KEY - */ - static final String TAG_SET_KEY = "TagSet"; - - /** - * Key that specifies the name of the feature color mode to use for coloring - * scheme based on feature color modes. A non-null value means - * the coloring scheme is based on feature values. - * - * @see #NO_COLORING_KEY - * @see #TAG_SET_KEY - */ - static final String FEATURE_COLOR_MODE_KEY = "FeatureColorMode"; - - /** - * Key that specifies the name of the chosen context provider. Values are - * strings. - */ - static final String CHOSEN_CONTEXT_PROVIDER_KEY = "ContextProvider"; - - /** - * Key that specifies whether the colorbar is visible. - */ - static final String COLORBAR_VISIBLE_KEY = "ColorbarVisible"; - - /** - * Key that specifies the colorbar position. Values are {@link Position} - * enum values. - */ - static final String COLORBAR_POSITION_KEY = "ColorbarPosition"; - - /** - * Key that specifies settings specific to the branch-graph view in a common - * view. Values are Map. - */ - static final String BRANCH_GRAPH = "BranchGraph"; - - /** - * Serializes a GUI state map into a XML element. - * - * @param guiState - * the GUI state to serialize. - * @return a new XML element. - */ - static < V extends IMastodonFrameView & IMastodonView > Element toXml( final V view ) - { - final Map< String, Object > guiState = getGuiState( view ); - final Element element = new Element( WINDOW_TAG ); - toXml( guiState, element ); - return element; - } - - static void toXml( final Map< String, Object > map, final Element element ) - { - for ( final Entry< String, Object > entry : map.entrySet() ) - { - final Element el = toXml( entry.getKey(), entry.getValue() ); - element.addContent( el ); - } - } - - @SuppressWarnings( "unchecked" ) - static Element toXml( final String key, final Object value ) - { - final Element el; - if ( value instanceof Integer ) - el = XmlHelpers.intElement( key, ( Integer ) value ); - else if ( value instanceof int[] ) - el = XmlHelpers.intArrayElement( key, ( int[] ) value ); - else if ( value instanceof Double ) - el = XmlHelpers.doubleElement( key, ( Double ) value ); - else if ( value instanceof double[] ) - el = XmlHelpers.doubleArrayElement( key, ( double[] ) value ); - else if ( value instanceof AffineGet ) - el = XmlHelpers.affineTransform3DElement( key, ( AffineGet ) value ); - else if ( value instanceof Boolean ) - el = XmlHelpers.booleanElement( key, ( Boolean ) value ); - else if ( value instanceof String ) - { - el = new Element( key ); - el.setText( value.toString() ); - } - else if ( value instanceof ScreenTransform ) - { - final ScreenTransform t = ( ScreenTransform ) value; - el = XmlHelpers.doubleArrayElement( key, new double[] { - t.getMinX(), - t.getMaxX(), - t.getMinY(), - t.getMaxY(), - t.getScreenWidth(), - t.getScreenHeight() - } ); - } - else if ( value instanceof org.mastodon.views.grapher.datagraph.ScreenTransform ) - { - final org.mastodon.views.grapher.datagraph.ScreenTransform t = - ( org.mastodon.views.grapher.datagraph.ScreenTransform ) value; - el = XmlHelpers.doubleArrayElement( key, new double[] { - t.getMinX(), - t.getMaxX(), - t.getMinY(), - t.getMaxY(), - t.getScreenWidth(), - t.getScreenHeight() - } ); - } - else if ( value instanceof Position ) - { - el = new Element( key ); - el.setText( ( ( Position ) value ).name() ); - } - else if ( value instanceof Element ) - { - el = new Element( key ); - el.setContent( ( Element ) value ); - } - else if ( value instanceof Map ) - { - el = new Element( key ); - toXml( ( Map< String, Object > ) value, el ); - } - else if ( value instanceof List ) - { - el = new Element( key ); - final List< Object > os = ( List< Object > ) value; - for ( final Object o : os ) - { - final Element child = toXml( key, o ); - el.addContent( child ); - } - } - else - { - System.err.println( "Do not know how to serialize object " + value + " for key " + key + "." ); - el = null; - } - return el; - } - - /** - * Wraps GUI state of a {@link MamutView} into a map. - * - * @param view - * the view. - * @return a new {@link Map}. - */ - private static < V extends IMastodonFrameView & IMastodonView > Map< String, Object > getGuiState( final V view ) - { - final Map< String, Object > guiState = new LinkedHashMap<>(); - - // View type. - guiState.put( VIEW_TYPE_KEY, view.getClass().getSimpleName() ); - - // Frame position and size. - final Rectangle bounds = view.getFrame().getBounds(); - guiState.put( FRAME_POSITION_KEY, new int[] { - ( int ) bounds.getMinX(), - ( int ) bounds.getMinY(), - ( int ) bounds.getWidth(), - ( int ) bounds.getHeight() } ); - - // Lock groups. - guiState.put( GROUP_HANDLE_ID_KEY, view.getGroupHandle().getGroupId() ); - - // Settings panel visibility. - guiState.put( SETTINGS_PANEL_VISIBLE_KEY, view.getFrame().isSettingsPanelVisible() ); - - // View-specifics. - if ( view instanceof MamutViewBdv ) - getGuiStateBdv( ( MamutViewBdv ) view, guiState ); - else if ( view instanceof MamutBranchViewBdv ) - getGuiStateBranchBdv( ( MamutBranchViewBdv ) view, guiState ); - else if ( view instanceof MamutViewTrackScheme ) - getGuiStateTrackScheme( ( MamutViewTrackScheme ) view, guiState ); - else if ( view instanceof MamutBranchViewTrackScheme ) - getGuiStateBranchTrackScheme( ( MamutBranchViewTrackScheme ) view, guiState ); - else if ( view instanceof MamutViewTable ) - getGuiStateTable( ( MamutViewTable ) view, guiState ); - else if ( view instanceof MamutViewGrapher ) - getGuiStateGrapher( ( MamutViewGrapher ) view, guiState ); - - return guiState; - } - - private static void getGuiStateGrapher( final MamutViewGrapher view, final Map< String, Object > guiState ) - { - final DataDisplayPanel< Spot, Link > dataDisplayPanel = view.getDataDisplayPanel(); - - // Transform. - final org.mastodon.views.grapher.datagraph.ScreenTransform t = dataDisplayPanel.getScreenTransform().get(); - guiState.put( GRAPHER_TRANSFORM_KEY, t ); - - // Coloring. - final ColoringModelMain< Spot, Link, BranchSpot, BranchLink > coloringModel = view.getColoringModel(); - getColoringState( coloringModel, guiState ); - - // Colorbar. - final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); - getColorBarOverlayState( colorBarOverlay, guiState ); - - // Context provider. - guiState.put( CHOSEN_CONTEXT_PROVIDER_KEY, view.getContextChooser().getChosenProvider().getName() ); - } - - /** - * Stores the {@link MamutViewTable} GUI state in the specified map. - * - * @param view - * the {@link MamutViewTable}. - * @param guiState - * the map to store info into. - */ - private static void getGuiStateTable( final MamutViewTable view, final Map< String, Object > guiState ) - { - // Selection table or not. - guiState.put( TABLE_SELECTION_ONLY, view.isSelectionTable() ); - - // Currently displayed table. - final FeatureTagTablePanel< ? > currentlyDisplayedTable = view.getFrame().getCurrentlyDisplayedTable(); - String displayedTableName = ""; - - // Table visible rectangles. - final List< FeatureTagTablePanel< ? > > tables = view.getFrame().getTables(); - final List< String > names = view.getFrame().getTableNames(); - final List< Map< String, Object > > tableGuiStates = new ArrayList<>( names.size() ); - for ( int i = 0; i < names.size(); i++ ) - { - final String name = names.get( i ); - final FeatureTagTablePanel< ? > table = tables.get( i ); - - if ( table == currentlyDisplayedTable ) - displayedTableName = name; - - final JViewport viewportVertex = table.getScrollPane().getViewport(); - final Point tableRect = viewportVertex.getViewPosition(); - - final LinkedHashMap< String, Object > tableGuiState = new LinkedHashMap<>(); - tableGuiState.put( TABLE_NAME, name ); - tableGuiState.put( TABLE_VISIBLE_POS, new int[] { - tableRect.x, - tableRect.y } ); - - tableGuiStates.add( tableGuiState ); - } - guiState.put( TABLE_ELEMENT, tableGuiStates ); - guiState.put( TABLE_DISPLAYED, displayedTableName ); - - // Coloring for core graph. - final ColoringModel coloringModel = view.getColoringModel(); - getColoringState( coloringModel, guiState ); - - // Coloring for branch-graph. - final ColoringModel branchColoringModel = view.getBranchColoringModel(); - final Map< String, Object > branchGraphMap = new HashMap<>(); - getColoringState( branchColoringModel, branchGraphMap ); - guiState.put( BRANCH_GRAPH, branchGraphMap ); - - // Context provider. - guiState.put( CHOSEN_CONTEXT_PROVIDER_KEY, view.getContextChooser().getChosenProvider().getName() ); - } - - /** - * Stores the {@link MamutViewTrackScheme} GUI state in the specified map. - * - * @param view - * the {@link MamutViewTrackScheme}. - * @param guiState - * the map to store info into. - */ - private static void getGuiStateTrackScheme( final MamutViewTrackScheme view, final Map< String, Object > guiState ) - { - final TrackSchemePanel trackschemePanel = view.getTrackschemePanel(); - - // Edit position to reflect the fact that we store the TrackScheme panel - // width and height. - final Point point = view.getFrame().getLocation(); - guiState.put( FRAME_POSITION_KEY, new int[] { - point.x, - point.y, - trackschemePanel.getDisplay().getWidth(), - trackschemePanel.getDisplay().getHeight() } ); - - // Transform. - final ScreenTransform t = trackschemePanel.getScreenTransform().get(); - guiState.put( TRACKSCHEME_TRANSFORM_KEY, t ); - - // Coloring. - final ColoringModelMain< Spot, Link, BranchSpot, BranchLink > coloringModel = view.getColoringModel(); - getColoringState( coloringModel, guiState ); - - // Colorbar. - final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); - getColorBarOverlayState( colorBarOverlay, guiState ); - - // Context provider. - guiState.put( CHOSEN_CONTEXT_PROVIDER_KEY, view.getContextChooser().getChosenProvider().getName() ); - } - - /** - * Stores the {@link MamutBranchViewTrackScheme} GUI state in the specified - * map. - * - * @param view - * the {@link MamutBranchViewTrackScheme}. - * @param guiState - * the map to store info into. - */ - private static void getGuiStateBranchTrackScheme( final MamutBranchViewTrackScheme view, - final Map< String, Object > guiState ) - { - final TrackSchemePanel trackschemePanel = view.getFrame().getTrackschemePanel(); - - // Edit position to reflect the fact that we store the TrackScheme panel - // width and height. - final Point point = view.getFrame().getLocation(); - guiState.put( FRAME_POSITION_KEY, new int[] { - point.x, - point.y, - trackschemePanel.getDisplay().getWidth(), - trackschemePanel.getDisplay().getHeight() } ); - - // Transform. - final ScreenTransform t = trackschemePanel.getScreenTransform().get(); - guiState.put( TRACKSCHEME_TRANSFORM_KEY, t ); - - // Coloring. - final ColoringModel coloringModel = view.getColoringModel(); - getColoringState( coloringModel, guiState ); - - // Colorbar. - final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); - getColorBarOverlayState( colorBarOverlay, guiState ); - } - - /** - * Stores the {@link MamutViewBdv} GUI state in the specified map. - * - * @param view - * the {@link MamutViewBdv}. - * @param guiState - * the map to store info into. - */ - private static void getGuiStateBdv( final MamutViewBdv view, final Map< String, Object > guiState ) - { - // Viewer state. - final Element stateEl = view.getViewerPanelMamut().stateToXml(); - guiState.put( BDV_STATE_KEY, stateEl ); - // Transform. - final AffineTransform3D t = new AffineTransform3D(); - view.getViewerPanelMamut().state().getViewerTransform( t ); - guiState.put( BDV_TRANSFORM_KEY, t ); - // Coloring. - final ColoringModel coloringModel = view.getColoringModel(); - getColoringState( coloringModel, guiState ); - // Colorbar. - final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); - getColorBarOverlayState( colorBarOverlay, guiState ); - } - - /** - * Stores the {@link MamutBranchViewBdv} GUI state in the specified map. - * - * @param view - * the {@link MamutViewBdv}. - * @param guiState - * the map to store info into. - */ - private static void getGuiStateBranchBdv( final MamutBranchViewBdv view, final Map< String, Object > guiState ) - { - // Viewer state. - final Element stateEl = view.getViewerPanelMamut().stateToXml(); - guiState.put( BDV_STATE_KEY, stateEl ); - // Transform. - final AffineTransform3D t = new AffineTransform3D(); - view.getViewerPanelMamut().state().getViewerTransform( t ); - guiState.put( BDV_TRANSFORM_KEY, t ); - // Coloring. - final ColoringModel coloringModel = view.getColoringModel(); - getColoringState( coloringModel, guiState ); - // Colorbar. - final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); - getColorBarOverlayState( colorBarOverlay, guiState ); - } - - /** - * Reads the coloring state of a view and stores it into the specified map. - * - * @param coloringModel - * the coloring model to read from. - * @param guiState - * the map to store it to. - */ - private static void getColoringState( final ColoringModel coloringModel, final Map< String, Object > guiState ) - { - final boolean noColoring = coloringModel.noColoring(); - guiState.put( NO_COLORING_KEY, noColoring ); - if ( !noColoring ) - if ( coloringModel.getTagSet() != null ) - guiState.put( TAG_SET_KEY, coloringModel.getTagSet().getName() ); - else if ( coloringModel.getFeatureColorMode() != null ) - guiState.put( FEATURE_COLOR_MODE_KEY, coloringModel.getFeatureColorMode().getName() ); - } - - private static void getColorBarOverlayState( final ColorBarOverlay colorBarOverlay, - final Map< String, Object > guiState ) - { - guiState.put( COLORBAR_VISIBLE_KEY, colorBarOverlay.isVisible() ); - guiState.put( COLORBAR_POSITION_KEY, colorBarOverlay.getPosition() ); - } - - /** - * Deserializes a GUI state from XML and recreate view windows as specified. - * - * @param windowsEl - * the XML element that stores the GUI state of a view. - * @param windowManager - * the application {@link WindowManager}. - */ - static void fromXml( final Element windowsEl, final WindowManager windowManager ) - { - // To deal later with context providers. - final Map< String, ContextProvider< Spot > > contextProviders = new HashMap<>(); - final Map< ContextChooser< Spot >, String > contextChosers = new HashMap<>(); - - final List< Element > viewEls = windowsEl.getChildren( WINDOW_TAG ); - for ( final Element viewEl : viewEls ) - { - final Map< String, Object > guiState = xmlToMap( viewEl ); - final String typeStr = ( String ) guiState.get( VIEW_TYPE_KEY ); - switch ( typeStr ) - { - case "MamutViewBdv": - { - try - { - final MamutViewBdv bdv = windowManager.createBigDataViewer( guiState ); - - // Store context provider. - contextProviders.put( bdv.getContextProvider().getName(), bdv.getContextProvider() ); - } - catch ( final IllegalArgumentException iae ) - { - System.err.println( "Info: Failed restoring state of a BigDataViewer window, thus not showing it.\n" - + " You may want to resave your project to replace the previous (failing) state with the current (okay) state." ); - } - break; - } - - case "MamutBranchViewBdv": - { - windowManager.createBranchBigDataViewer( guiState ); - break; - } - - case "MamutViewTrackScheme": - { - final MamutViewTrackScheme ts = windowManager.createTrackScheme( guiState ); - - // Deal with context chooser. - final String desiredProvider = ( String ) guiState.get( CHOSEN_CONTEXT_PROVIDER_KEY ); - if ( null != desiredProvider ) - contextChosers.put( ts.getContextChooser(), desiredProvider ); - break; - } - - case "MamutBranchViewTrackScheme": - { - windowManager.createBranchTrackScheme( guiState ); - break; - } - - case "MamutBranchViewTrackSchemeHierarchy": - { - windowManager.createHierarchyTrackScheme( guiState ); - break; - } - - case "MamutViewTable": - { - final MamutViewTable table = windowManager.createTable( guiState ); - - // Deal with context chooser. - final String desiredProvider = ( String ) guiState.get( CHOSEN_CONTEXT_PROVIDER_KEY ); - if ( null != desiredProvider ) - contextChosers.put( table.getContextChooser(), desiredProvider ); - break; - } - - case "MamutViewGrapher": - { - final MamutViewGrapher grapher = windowManager.createGrapher( guiState ); - - // Deal with context chooser. - final String desiredProvider = ( String ) guiState.get( CHOSEN_CONTEXT_PROVIDER_KEY ); - if ( null != desiredProvider ) - contextChosers.put( grapher.getContextChooser(), desiredProvider ); - break; - } - - default: - System.err.println( "Deserializing GUI state: Unknown window type: " + typeStr + "." ); - continue; - } - } - - /* - * Loop again on context choosers and try to give them their desired - * context provider. - */ - - for ( final ContextChooser< Spot > contextChooser : contextChosers.keySet() ) - { - final String desiredContextProvider = contextChosers.get( contextChooser ); - final ContextProvider< Spot > contextProvider = contextProviders.get( desiredContextProvider ); - if ( null != contextProvider ) - contextChooser.choose( contextProvider ); - } - } - - private static Map< String, Object > xmlToMap( final Element viewEl ) - { - final Map< String, Object > guiState = new HashMap<>(); - final List< Element > children = viewEl.getChildren(); - for ( final Element el : children ) - { - final String key = el.getName(); - final Object value; - switch ( key ) - { - case BDV_STATE_KEY: - value = el; - break; - case BDV_TRANSFORM_KEY: - value = XmlHelpers.getAffineTransform3D( viewEl, key ); - break; - case FRAME_POSITION_KEY: - final int[] pos = XmlHelpers.getIntArray( viewEl, key ); - value = sanitize( pos ); - break; - case TAG_SET_KEY: - case FEATURE_COLOR_MODE_KEY: - case VIEW_TYPE_KEY: - case CHOSEN_CONTEXT_PROVIDER_KEY: - value = el.getTextTrim(); - break; - case TRACKSCHEME_TRANSFORM_KEY: - { - final double[] arr = XmlHelpers.getDoubleArray( viewEl, key ); - value = new ScreenTransform( arr[ 0 ], arr[ 1 ], arr[ 2 ], arr[ 3 ], ( int ) arr[ 4 ], - ( int ) arr[ 5 ] ); - break; - } - case GRAPHER_TRANSFORM_KEY: - { - final double[] arr = XmlHelpers.getDoubleArray( viewEl, key ); - value = new org.mastodon.views.grapher.datagraph.ScreenTransform( arr[ 0 ], arr[ 1 ], arr[ 2 ], - arr[ 3 ], ( int ) arr[ 4 ], ( int ) arr[ 5 ] ); - break; - } - case TABLE_SELECTION_ONLY: - case NO_COLORING_KEY: - case SETTINGS_PANEL_VISIBLE_KEY: - case COLORBAR_VISIBLE_KEY: - value = XmlHelpers.getBoolean( viewEl, key ); - break; - case COLORBAR_POSITION_KEY: - final String str = XmlHelpers.getText( viewEl, key ); - value = Position.valueOf( str ); - break; - case GROUP_HANDLE_ID_KEY: - { - value = XmlHelpers.getInt( viewEl, key ); - break; - } - case TABLE_ELEMENT: - { - final List< Element > els = el.getChildren(); - final List< Map< String, Object > > maps = new ArrayList<>( els.size() ); - for ( final Element child : els ) - { - final String name = child.getChildTextTrim( TABLE_NAME ); - final int[] tablePos = XmlHelpers.getIntArray( child, TABLE_VISIBLE_POS ); - final Map< String, Object > m = new HashMap<>(); - m.put( TABLE_NAME, name ); - m.put( TABLE_VISIBLE_POS, tablePos ); - maps.add( m ); - } - value = maps; - break; - } - case TABLE_DISPLAYED: - value = XmlHelpers.getText( viewEl, TABLE_DISPLAYED ); - break; - case BRANCH_GRAPH: - value = xmlToMap( el ); - break; - default: - System.err.println( "Unknown GUI config parameter: " + key + " found in GUI file." ); - continue; - } - guiState.put( key, value ); - } - return guiState; - } - - private static final int MIN_WIDTH = 200; - - private static final int MIN_HEIGHT = MIN_WIDTH; - - /** - * Makes sure the specified position array won't end in creating windows - * off-screen. We impose that a window is fully on *one* screen and not - * split over severals. We also impose a minimal size for the windows. - *

- * The pos array is { x, y, width, height }. - * - * @param pos - * the position array. - * @return the same position array. - */ - private static int[] sanitize( final int[] pos ) - { - assert pos.length == 4; - final GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - if ( null == ge ) - return pos; - final GraphicsDevice sd[] = ge.getScreenDevices(); - if ( sd.length < 1 ) - return pos; - - // Window min size. - pos[ 2 ] = Math.max( MIN_WIDTH, pos[ 2 ] ); - pos[ 3 ] = Math.max( MIN_HEIGHT, pos[ 3 ] ); - - for ( final GraphicsDevice gd : sd ) - { - final Rectangle bounds = gd.getDefaultConfiguration().getBounds(); - if ( bounds.contains( pos[ 0 ], pos[ 1 ], pos[ 2 ], pos[ 3 ] ) ) - // Fully in a screen, nothing to do. - return pos; - - if ( bounds.contains( pos[ 0 ], pos[ 1 ] ) ) - { - /* - * This window is on this screen, but exits it. First resize it - * so that it is not bigger than the screen. - */ - pos[ 2 ] = Math.min( bounds.width, pos[ 2 ] ); - pos[ 3 ] = Math.min( bounds.height, pos[ 3 ] ); - - /* - * Then move it back so that its bottom right corner is in the - * screen. - */ - if ( pos[ 0 ] + pos[ 2 ] > bounds.x + bounds.width ) - pos[ 0 ] -= ( pos[ 0 ] - bounds.x + pos[ 2 ] - bounds.width ); - - if ( pos[ 1 ] + pos[ 3 ] > bounds.y + bounds.height ) - pos[ 1 ] -= ( pos[ 1 ] - bounds.y + pos[ 3 ] - bounds.height ); - - return pos; - } - } - - /* - * Ok we did not find a screen in which this window is. So we will put - * it in the first screen. - */ - final Rectangle bounds = sd[ 0 ].getDefaultConfiguration().getBounds(); - pos[ 0 ] = Math.max( bounds.x, - Math.min( bounds.x + bounds.width - pos[ 2 ], pos[ 0 ] ) ); - pos[ 1 ] = Math.max( bounds.y, - Math.min( bounds.y + bounds.height - pos[ 3 ], pos[ 1 ] ) ); - - if ( bounds.contains( pos[ 0 ], pos[ 1 ], pos[ 2 ], pos[ 3 ] ) ) - // Fully in a screen, nothing to do. - return pos; - - /* - * This window is on this screen, but exits it. First resize it so that - * it is not bigger than the screen. - */ - pos[ 2 ] = Math.min( bounds.width, pos[ 2 ] ); - pos[ 3 ] = Math.min( bounds.height, pos[ 3 ] ); - - /* - * Then move it back so that its bottom right corner is in the screen. - */ - pos[ 0 ] -= ( pos[ 0 ] - bounds.x + pos[ 2 ] - bounds.width ); - pos[ 1 ] -= ( pos[ 1 ] - bounds.y + pos[ 3 ] - bounds.height ); - - return pos; - } -} diff --git a/src/main/java/org/mastodon/mamut/MamutViewTable.java b/src/main/java/org/mastodon/mamut/MamutViewTable.java index 4e1f2ab37..d486261b6 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTable.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTable.java @@ -30,15 +30,11 @@ import static org.mastodon.app.ui.ViewMenuBuilder.item; import static org.mastodon.app.ui.ViewMenuBuilder.separator; +import static org.mastodon.mamut.MamutBranchView.BRANCH_GRAPH; import static org.mastodon.mamut.MamutMenuBuilder.editMenu; import static org.mastodon.mamut.MamutMenuBuilder.fileMenu; import static org.mastodon.mamut.MamutMenuBuilder.tagSetMenu; import static org.mastodon.mamut.MamutMenuBuilder.viewMenu; -import static org.mastodon.mamut.MamutViewStateSerialization.BRANCH_GRAPH; -import static org.mastodon.mamut.MamutViewStateSerialization.TABLE_DISPLAYED; -import static org.mastodon.mamut.MamutViewStateSerialization.TABLE_ELEMENT; -import static org.mastodon.mamut.MamutViewStateSerialization.TABLE_SELECTION_ONLY; -import static org.mastodon.mamut.MamutViewStateSerialization.TABLE_VISIBLE_POS; import java.awt.Point; import java.util.Collections; @@ -97,6 +93,57 @@ public class MamutViewTable extends MamutView< ViewGraph< Spot, Link, Spot, Link >, Spot, Link > { + /** + * Key that specifies whether a table only display the selection or the + * whole model. Boolean instance. + */ + public static final String TABLE_SELECTION_ONLY = "TableSelectionOnly"; + + /** + * Key that specifies whether a table is currently showing the vertex table. + * If false, then the edge table is displayed. + */ + public static final String TABLE_DISPLAYING_VERTEX_TABLE = "TableVertexTableDisplayed"; + + /** + * Key that specifies what table is currently showing in the table view. + * Values are String that points to a tab name in the tabbed + * pane. + */ + public static final String TABLE_DISPLAYED = "TableDisplayed"; + + /** + * Key to the parameter that stores the vertex table displayed rectangle. + * Value is and int[] array of 4 elements: x, y, width and + * height. + */ + public static final String TABLE_VERTEX_TABLE_VISIBLE_POS = "TableVertexTableVisibleRect"; + + /** + * Key to the parameter that stores the table displayed position. Value is + * and int[] array of 2 elements: x, y. + */ + public static final String TABLE_VISIBLE_POS = "TableVisibleRect"; + + /** + * Key to the parameter that stores the GUI states of multiple tables. Value + * is a List>. + */ + public static final String TABLE_ELEMENT = "Tables"; + + /** + * Key to the parameter that stores the table name in a table GUI state. + * Value is a String. + */ + public static final String TABLE_NAME = "TableName"; + + /** + * Key to the parameter that stores the edge table displayed rectangle. + * Value is and int[] array of 4 elements: x, y, width and + * height. + */ + public static final String TABLE_EDGE_TABLE_VISIBLE_POS = "TableEdgeTableVisibleRect"; + public static String csvExportPath = null; private static final String[] CONTEXTS = new String[] { KeyConfigContexts.TABLE }; @@ -377,7 +424,7 @@ public MyTableViewFrame getFrame() } @SuppressWarnings( "unchecked" ) - ContextChooser< Spot > getContextChooser() + public ContextChooser< Spot > getContextChooser() { /* * We configured the table creator so that only the first table pair, @@ -390,17 +437,17 @@ ContextChooser< Spot > getContextChooser() * De/serialization related methods. */ - ColoringModelMain< Spot, Link, BranchSpot, BranchLink > getColoringModel() + public ColoringModelMain< Spot, Link, BranchSpot, BranchLink > getColoringModel() { return coloringModel; } - ColoringModel getBranchColoringModel() + public ColoringModel getBranchColoringModel() { return branchColoringModel; } - boolean isSelectionTable() + public boolean isSelectionTable() { return selectionTable; } diff --git a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java index 881433499..19c282b2a 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java @@ -35,9 +35,6 @@ import static org.mastodon.mamut.MamutMenuBuilder.editMenu; import static org.mastodon.mamut.MamutMenuBuilder.tagSetMenu; import static org.mastodon.mamut.MamutMenuBuilder.viewMenu; -import static org.mastodon.mamut.MamutViewStateSerialization.FRAME_POSITION_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.SETTINGS_PANEL_VISIBLE_KEY; -import static org.mastodon.mamut.MamutViewStateSerialization.TRACKSCHEME_TRANSFORM_KEY; import java.awt.Component; import java.util.HashMap; @@ -89,6 +86,13 @@ public class MamutViewTrackScheme extends MamutView< TrackSchemeGraph< Spot, Link >, TrackSchemeVertex, TrackSchemeEdge > { + + /** + * Key for the transform in a TrackScheme view. Value is a + * {@link ScreenTransform} instance. + */ + public static final String TRACKSCHEME_TRANSFORM_KEY = "TrackSchemeTransform"; + private final ContextChooser< Spot > contextChooser; /** @@ -297,12 +301,12 @@ public MamutViewTrackScheme( final MamutAppModel appModel, final Map< String, Ob frame.getTrackschemePanel().getDisplay().requestFocusInWindow(); } - ContextChooser< Spot > getContextChooser() + public ContextChooser< Spot > getContextChooser() { return contextChooser; } - ColoringModelMain< Spot, Link, BranchSpot, BranchLink > getColoringModel() + public ColoringModelMain< Spot, Link, BranchSpot, BranchLink > getColoringModel() { return coloringModel; } @@ -312,12 +316,12 @@ ColoringModelMain< Spot, Link, BranchSpot, BranchLink > getColoringModel() * * @return the {@link TrackSchemePanel}. */ - TrackSchemePanel getTrackschemePanel() + public TrackSchemePanel getTrackschemePanel() { return ( ( TrackSchemeFrame ) getFrame() ).getTrackschemePanel(); } - ColorBarOverlay getColorBarOverlay() + public ColorBarOverlay getColorBarOverlay() { return colorBarOverlay; } diff --git a/src/main/java/org/mastodon/mamut/ProjectManager.java b/src/main/java/org/mastodon/mamut/ProjectManager.java index 9f236974b..5e5b39307 100644 --- a/src/main/java/org/mastodon/mamut/ProjectManager.java +++ b/src/main/java/org/mastodon/mamut/ProjectManager.java @@ -76,9 +76,9 @@ import org.mastodon.mamut.importer.trackmate.TrackMateImporter; import org.mastodon.mamut.io.project.MamutImagePlusProject; import org.mastodon.mamut.io.project.MamutProject; -import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.io.project.MamutProject.ProjectReader; import org.mastodon.mamut.io.project.MamutProject.ProjectWriter; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; @@ -181,8 +181,6 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) } } - private final WindowManager windowManager; - private final TgmmImportDialog tgmmImportDialog; private final SimiImportDialog simiImportDialog; @@ -209,10 +207,8 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) private final AbstractNamedAction exportMamutAction; - public ProjectManager( final WindowManager windowManager ) + public ProjectManager() { - this.windowManager = windowManager; - tgmmImportDialog = new TgmmImportDialog( null ); simiImportDialog = new SimiImportDialog( null ); @@ -274,7 +270,7 @@ public synchronized void createProject() try { - open( new MamutProject( null, file ) ); + open( MamutProjectIO.emptyProject( file ) ); } catch ( final IOException | SpimDataException e ) { @@ -350,7 +346,7 @@ public synchronized void createProjectFromUrl() try { xmlIoSpimData.save( spimData, file.getAbsolutePath() ); - open( new MamutProject( null, file ) ); + open( MamutProjectIO.emptyProject( file ) ); } catch ( final IOException | SpimDataException e ) { @@ -381,7 +377,7 @@ else if ( project != null && project.getProjectRoot() != null ) try { proposedProjectRoot = file; - final MamutProject project = new MamutProjectIO().load( file.getAbsolutePath() ); + final MamutProject project = MamutProjectIO.load( file.getAbsolutePath() ); openWithDialog( project ); } catch ( final IOException | SpimDataException e ) @@ -867,11 +863,6 @@ public synchronized void exportMamut() } } - public MamutProject getProject() - { - return project; - } - private static final String EXT_DOT_MASTODON = ".mastodon"; private static String stripExtensionIfPresent( final String fn, final String ext ) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 0d4124fd8..41cd6419b 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -56,11 +56,7 @@ import org.mastodon.mamut.feature.MamutFeatureProjectionsManager; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.plugin.MamutPlugin; -import org.mastodon.mamut.plugin.MamutPluginAppModel; -import org.mastodon.mamut.plugin.MamutPlugins; import org.mastodon.model.tag.ui.TagSetDialog; -import org.mastodon.ui.SelectionActions; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; import org.mastodon.ui.keymap.CommandDescriptionProvider; import org.mastodon.ui.keymap.CommandDescriptions; @@ -81,11 +77,8 @@ import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleManager; import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleSettingsPage; import org.scijava.Context; -import org.scijava.InstantiableException; import org.scijava.listeners.Listeners; import org.scijava.plugin.Plugin; -import org.scijava.plugin.PluginInfo; -import org.scijava.plugin.PluginService; import org.scijava.ui.behaviour.KeyPressedManager; import org.scijava.ui.behaviour.util.AbstractNamedAction; import org.scijava.ui.behaviour.util.Actions; @@ -111,103 +104,44 @@ public class WindowManager { public static final String NEW_BDV_VIEW = "new bdv view"; - public static final String NEW_TRACKSCHEME_VIEW = "new trackscheme view"; - public static final String NEW_TABLE_VIEW = "new full table view"; - public static final String NEW_SELECTION_TABLE_VIEW = "new selection table view"; - public static final String NEW_GRAPHER_VIEW = "new grapher view"; - public static final String PREFERENCES_DIALOG = "Preferences"; - public static final String TAGSETS_DIALOG = "edit tag sets"; - public static final String COMPUTE_FEATURE_DIALOG = "compute features"; - public static final String OPEN_ONLINE_DOCUMENTATION = "open online documentation"; static final String[] NEW_BDV_VIEW_KEYS = new String[] { "not mapped" }; - static final String[] NEW_TRACKSCHEME_VIEW_KEYS = new String[] { "not mapped" }; - static final String[] NEW_TABLE_VIEW_KEYS = new String[] { "not mapped" }; - static final String[] NEW_SELECTION_TABLE_VIEW_KEYS = new String[] { "not mapped" }; - static final String[] NEW_GRAPHER_VIEW_KEYS = new String[] { "not mapped" }; - static final String[] PREFERENCES_DIALOG_KEYS = new String[] { "meta COMMA", "ctrl COMMA" }; - static final String[] TAGSETS_DIALOG_KEYS = new String[] { "not mapped" }; - static final String[] COMPUTE_FEATURE_DIALOG_KEYS = new String[] { "not mapped" }; - static final String[] OPEN_ONLINE_DOCUMENTATION_KEYS = new String[] { "not mapped" }; static final String NEW_BRANCH_BDV_VIEW = "new branch bdv view"; - static final String NEW_BRANCH_TRACKSCHEME_VIEW = "new branch trackscheme view"; - static final String NEW_HIERARCHY_TRACKSCHEME_VIEW = "new hierarchy trackscheme view"; static final String[] NEW_BRANCH_BDV_VIEW_KEYS = new String[] { "not mapped" }; - static final String[] NEW_BRANCH_TRACKSCHEME_VIEW_KEYS = new String[] { "not mapped" }; - static final String[] NEW_HIERARCHY_TRACKSCHEME_VIEW_KEYS = new String[] { "not mapped" }; public static final String DOCUMENTATION_URL = "https://mastodon.readthedocs.io/en/latest/"; - /* - * Command descriptions for all provided commands - */ - @Plugin( type = CommandDescriptionProvider.class ) - public static class Descriptions extends CommandDescriptionProvider - { - public Descriptions() - { - super( KeyConfigContexts.MASTODON ); - } - - @Override - public void getCommandDescriptions( final CommandDescriptions descriptions ) - { - descriptions.add( NEW_BDV_VIEW, NEW_BDV_VIEW_KEYS, "Open a new BigDataViewer view." ); - descriptions.add( NEW_TRACKSCHEME_VIEW, NEW_TRACKSCHEME_VIEW_KEYS, "Open a new TrackScheme view." ); - descriptions.add( NEW_TABLE_VIEW, NEW_TABLE_VIEW_KEYS, "Open a new table view. " - + "The table displays the full data." ); - descriptions.add( NEW_SELECTION_TABLE_VIEW, NEW_SELECTION_TABLE_VIEW_KEYS, - "Open a new selection table view. " - + "The table only displays the current selection and " - + "is updated as the selection changes." ); - descriptions.add( PREFERENCES_DIALOG, PREFERENCES_DIALOG_KEYS, "Edit Mastodon preferences." ); - descriptions.add( TAGSETS_DIALOG, TAGSETS_DIALOG_KEYS, "Edit tag definitions." ); - descriptions.add( COMPUTE_FEATURE_DIALOG, COMPUTE_FEATURE_DIALOG_KEYS, - "Show the feature computation dialog." ); - descriptions.add( NEW_BRANCH_BDV_VIEW, NEW_BRANCH_BDV_VIEW_KEYS, "Open a new branch BigDataViewer view." ); - descriptions.add( NEW_BRANCH_TRACKSCHEME_VIEW, NEW_BRANCH_TRACKSCHEME_VIEW_KEYS, - "Open a new branch TrackScheme view." ); - descriptions.add( NEW_HIERARCHY_TRACKSCHEME_VIEW, NEW_HIERARCHY_TRACKSCHEME_VIEW_KEYS, - "Open a new hierarchy TrackScheme view." ); - descriptions.add( OPEN_ONLINE_DOCUMENTATION, OPEN_ONLINE_DOCUMENTATION_KEYS, - "Open the online documentation in a web browser." ); - descriptions.add( NEW_GRAPHER_VIEW, NEW_GRAPHER_VIEW_KEYS, "Open a new Grapher view." ); - } - } - - private final Context context; - - private final MamutPlugins plugins; - /** All currently open BigDataViewer windows. */ private final List< MamutViewBdv > bdvWindows = new ArrayList<>(); /** All currently open branch TrackScheme windows. */ private final List< MamutBranchViewBdv > bbdvWindows = new ArrayList<>(); - /** The {@link ContextProvider}s of all currently open BigDataViewer windows. */ + /** + * The {@link ContextProvider}s of all currently open BigDataViewer windows. + */ private final List< ContextProvider< Spot > > contextProviders = new ArrayList<>(); /** All currently open TrackScheme windows. */ @@ -236,8 +170,6 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) private final KeymapManager keymapManager; - private final Actions globalAppActions; - private final AbstractNamedAction newBdvViewAction; private final AbstractNamedAction newTrackSchemeViewAction; @@ -258,11 +190,9 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) private final AbstractNamedAction featureComputationAction; - private MamutAppModel appModel; + private final TagSetDialog tagSetDialog; - private TagSetDialog tagSetDialog; - - private JDialog featureComputationDialog; + private final JDialog featureComputationDialog; final ProjectManager projectManager; @@ -270,66 +200,51 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) private final PreferencesDialog settings; + private final MamutAppModel appModel; + /** * Creates a new, empty WindowManager instance using the specified context. * * @param context * the context to use. Cannot be null. + * @param globalActions */ - public WindowManager( final Context context ) + public WindowManager( final MamutAppModel appModel ) { - this.context = context; - - keyPressedManager = new KeyPressedManager(); - trackSchemeStyleManager = new TrackSchemeStyleManager(); - dataDisplayStyleManager = new DataDisplayStyleManager(); - renderSettingsManager = new RenderSettingsManager(); - featureColorModeManager = new FeatureColorModeManager(); - featureProjectionsManager = new MamutFeatureProjectionsManager( - context.getService( FeatureSpecsService.class ), - featureColorModeManager ); - keymapManager = new KeymapManager(); + this.appModel = appModel; + this.keyPressedManager = new KeyPressedManager(); + this.trackSchemeStyleManager = new TrackSchemeStyleManager(); + this.dataDisplayStyleManager = new DataDisplayStyleManager(); + this.renderSettingsManager = new RenderSettingsManager(); + this.featureColorModeManager = new FeatureColorModeManager(); + final Context context = appModel.getContext(); + this.featureProjectionsManager = new MamutFeatureProjectionsManager( context.getService( FeatureSpecsService.class ), featureColorModeManager ); + this.keymapManager = new KeymapManager(); final Keymap keymap = keymapManager.getForwardDefaultKeymap(); - plugins = new MamutPlugins( keymap ); - discoverPlugins(); - final CommandDescriptions descriptions = buildCommandDescriptions(); final Consumer< Keymap > augmentInputTriggerConfig = k -> descriptions.augmentInputTriggerConfig( k.getConfig() ); keymapManager.getUserStyles().forEach( augmentInputTriggerConfig ); keymapManager.getBuiltinStyles().forEach( augmentInputTriggerConfig ); - // TODO: naming, this should be named appActions and the - // AppModel.appActions should become modelActions? - // TODO: or rename AppModel --> ProjectModel, then projectActions? - globalAppActions = new Actions( keymap.getConfig(), KeyConfigContexts.MASTODON ); - keymap.updateListeners().add( () -> { - globalAppActions.updateKeyConfig( keymap.getConfig() ); - if ( appModel != null ) - appModel.getAppActions().updateKeyConfig( keymap.getConfig() ); - } ); + final Actions globalAppActions = appModel.getAppActions(); - projectManager = new ProjectManager( this ); + this.projectManager = new ProjectManager(); projectManager.install( globalAppActions ); - newBdvViewAction = - new RunnableActionPair( NEW_BDV_VIEW, this::createBigDataViewer, this::createBranchBigDataViewer ); - newTrackSchemeViewAction = - new RunnableActionPair( NEW_TRACKSCHEME_VIEW, this::createTrackScheme, this::createBranchTrackScheme ); - newTableViewAction = new RunnableAction( NEW_TABLE_VIEW, () -> createTable( false ) ); - newSelectionTableViewAction = new RunnableAction( NEW_SELECTION_TABLE_VIEW, () -> createTable( true ) ); - newGrapherViewAction = new RunnableAction( NEW_GRAPHER_VIEW, this::createGrapher ); - editTagSetsAction = new RunnableAction( TAGSETS_DIALOG, this::editTagSets ); - featureComputationAction = new RunnableAction( COMPUTE_FEATURE_DIALOG, this::computeFeatures ); - newBranchBdvViewAction = new RunnableAction( NEW_BRANCH_BDV_VIEW, this::createBranchBigDataViewer ); - newBranchTrackSchemeViewAction = - new RunnableAction( NEW_BRANCH_TRACKSCHEME_VIEW, this::createBranchTrackScheme ); - newHierarchyTrackSchemeViewAction = - new RunnableAction( NEW_HIERARCHY_TRACKSCHEME_VIEW, this::createHierarchyTrackScheme ); - final RunnableAction openOnlineDocumentation = - new RunnableAction( OPEN_ONLINE_DOCUMENTATION, this::openOnlineDocumentation ); + this.newBdvViewAction = new RunnableActionPair( NEW_BDV_VIEW, this::createBigDataViewer, this::createBranchBigDataViewer ); + this.newTrackSchemeViewAction = new RunnableActionPair( NEW_TRACKSCHEME_VIEW, this::createTrackScheme, this::createBranchTrackScheme ); + this.newTableViewAction = new RunnableAction( NEW_TABLE_VIEW, () -> createTable( false ) ); + this.newSelectionTableViewAction = new RunnableAction( NEW_SELECTION_TABLE_VIEW, () -> createTable( true ) ); + this.newGrapherViewAction = new RunnableAction( NEW_GRAPHER_VIEW, this::createGrapher ); + this.editTagSetsAction = new RunnableAction( TAGSETS_DIALOG, this::editTagSets ); + this.featureComputationAction = new RunnableAction( COMPUTE_FEATURE_DIALOG, this::computeFeatures ); + this.newBranchBdvViewAction = new RunnableAction( NEW_BRANCH_BDV_VIEW, this::createBranchBigDataViewer ); + this.newBranchTrackSchemeViewAction = new RunnableAction( NEW_BRANCH_TRACKSCHEME_VIEW, this::createBranchTrackScheme ); + this.newHierarchyTrackSchemeViewAction = new RunnableAction( NEW_HIERARCHY_TRACKSCHEME_VIEW, this::createHierarchyTrackScheme ); + final RunnableAction openOnlineDocumentation = new RunnableAction( OPEN_ONLINE_DOCUMENTATION, this::openOnlineDocumentation ); globalAppActions.namedAction( newBdvViewAction, NEW_BDV_VIEW_KEYS ); globalAppActions.namedAction( newTrackSchemeViewAction, NEW_TRACKSCHEME_VIEW_KEYS ); @@ -343,7 +258,7 @@ public WindowManager( final Context context ) globalAppActions.namedAction( newHierarchyTrackSchemeViewAction, NEW_HIERARCHY_TRACKSCHEME_VIEW_KEYS ); globalAppActions.namedAction( openOnlineDocumentation, OPEN_ONLINE_DOCUMENTATION_KEYS ); - settings = new PreferencesDialog( null, keymap, new String[] { KeyConfigContexts.MASTODON } ); + this.settings = new PreferencesDialog( null, keymap, new String[] { KeyConfigContexts.MASTODON } ); settings.addPage( new TrackSchemeStyleSettingsPage( "TrackScheme Styles", trackSchemeStyleManager ) ); settings.addPage( new RenderSettingsConfigPage( "BDV Render Settings", renderSettingsManager ) ); settings.addPage( new DataDisplayStyleSettingsPage( "Grapher styles", dataDisplayStyleManager ) ); @@ -355,82 +270,16 @@ public WindowManager( final Context context ) final ToggleDialogAction tooglePreferencesDialogAction = new ToggleDialogAction( PREFERENCES_DIALOG, settings ); globalAppActions.namedAction( tooglePreferencesDialogAction, PREFERENCES_DIALOG_KEYS ); - updateEnabledActions(); - - bdvViewCreatedListeners = new Listeners.SynchronizedList<>(); - } - - private void discoverPlugins() - { - if ( context == null ) - return; - - final PluginService pluginService = context.getService( PluginService.class ); - final List< PluginInfo< MamutPlugin > > infos = pluginService.getPluginsOfType( MamutPlugin.class ); - for ( final PluginInfo< MamutPlugin > info : infos ) - { - try - { - final MamutPlugin plugin = info.createInstance(); - context.inject( plugin ); - plugins.register( plugin ); - } - catch ( final InstantiableException e ) - { - e.printStackTrace(); - } - } - } - - private void updateEnabledActions() - { - newBdvViewAction.setEnabled( appModel != null ); - newTrackSchemeViewAction.setEnabled( appModel != null ); - newTableViewAction.setEnabled( appModel != null ); - newSelectionTableViewAction.setEnabled( appModel != null ); - newGrapherViewAction.setEnabled( appModel != null ); - newBranchBdvViewAction.setEnabled( appModel != null ); - newBranchTrackSchemeViewAction.setEnabled( appModel != null ); - newHierarchyTrackSchemeViewAction.setEnabled( appModel != null ); - editTagSetsAction.setEnabled( appModel != null ); - featureComputationAction.setEnabled( appModel != null ); - } - - void setAppModel( final MamutAppModel appModel ) - { - closeAllWindows(); - if ( this.appModel != null ) - this.appModel.close(); - - this.appModel = appModel; - if ( appModel == null ) - { - tagSetDialog.dispose(); - tagSetDialog = null; - featureComputationDialog.dispose(); - featureComputationDialog = null; - featureProjectionsManager.setModel( null, 1 ); - updateEnabledActions(); - return; - } + this.bdvViewCreatedListeners = new Listeners.SynchronizedList<>(); final Model model = appModel.getModel(); - UndoActions.install( appModel.getAppActions(), model ); - SelectionActions.install( appModel.getAppActions(), model.getGraph(), model.getGraph().getLock(), - model.getGraph(), appModel.getSelectionModel(), model ); - MamutActions.install( appModel.getAppActions(), appModel ); - final Keymap keymap = keymapManager.getForwardDefaultKeymap(); tagSetDialog = new TagSetDialog( null, model.getTagSetModel(), model, keymap, new String[] { KeyConfigContexts.MASTODON } ); tagSetDialog.setIconImages( TAGS_ICON ); featureComputationDialog = MamutFeatureComputation.getDialog( appModel, context ); featureComputationDialog.setIconImages( FEATURES_ICON ); featureProjectionsManager.setModel( model, appModel.getSharedBdvData().getSources().size() ); - - updateEnabledActions(); - - plugins.setAppPluginModel( new MamutPluginAppModel( appModel, this ) ); } private synchronized void addBdvWindow( final MamutViewBdv w ) @@ -636,15 +485,11 @@ public MamutViewBdv createBigDataViewer() */ public MamutViewBdv createBigDataViewer( final Map< String, Object > guiState ) { - if ( appModel != null ) - { - final MamutViewBdv view = new MamutViewBdv( appModel, guiState ); - view.getFrame().setIconImages( BDV_VIEW_ICON ); - addBdvWindow( view ); - bdvViewCreatedListeners.list.forEach( l -> l.bdvViewCreated( view ) ); - return view; - } - return null; + final MamutViewBdv view = new MamutViewBdv( appModel, guiState ); + view.getFrame().setIconImages( BDV_VIEW_ICON ); + addBdvWindow( view ); + bdvViewCreatedListeners.list.forEach( l -> l.bdvViewCreated( view ) ); + return view; } /** @@ -765,7 +610,7 @@ public MamutViewTable createTable( final Map< String, Object > guiState ) public MamutViewTable createTable( final boolean selectionOnly ) { final Map< String, Object > guiState = Collections.singletonMap( - MamutViewStateSerialization.TABLE_SELECTION_ONLY, Boolean.valueOf( selectionOnly ) ); + MamutViewTable.TABLE_SELECTION_ONLY, Boolean.valueOf( selectionOnly ) ); return createTable( guiState ); } @@ -994,8 +839,8 @@ public void closeAllWindows() /** * This method is called when the MainWindow is closed. */ - public void dispose() { - setAppModel( null ); + public void dispose() + { settings.dispose(); } @@ -1034,37 +879,11 @@ KeymapManager getKeymapManager() return keymapManager; } - // TODO: make package private - public MamutAppModel getAppModel() - { - return appModel; - } - public PreferencesDialog getPreferencesDialog() { return settings; } - Actions getGlobalAppActions() - { - return globalAppActions; - } - - MamutPlugins getPlugins() - { - return plugins; - } - - public Context getContext() - { - return context; - } - - public FeatureSpecsService getFeatureSpecsService() - { - return context.getService( FeatureSpecsService.class ); - } - /** * Exposes currently open BigDataViewer windows. * @@ -1089,14 +908,14 @@ public ProjectManager getProjectManager() private CommandDescriptions buildCommandDescriptions() { final CommandDescriptionsBuilder builder = new CommandDescriptionsBuilder(); - context.inject( builder ); + appModel.getContext().inject( builder ); builder.discoverProviders(); return builder.build(); } /** - * Classes that implement {@link BdvViewCreatedListener} get a notification when - * a new {@link MamutViewBdv} instance is created. + * Classes that implement {@link BdvViewCreatedListener} get a notification + * when a new {@link MamutViewBdv} instance is created. */ public interface BdvViewCreatedListener { @@ -1107,4 +926,41 @@ public Listeners< BdvViewCreatedListener > bdvViewCreatedListeners() { return bdvViewCreatedListeners; } + + /* + * Command descriptions for all provided commands + */ + @Plugin( type = CommandDescriptionProvider.class ) + public static class Descriptions extends CommandDescriptionProvider + { + public Descriptions() + { + super( KeyConfigContexts.MASTODON ); + } + + @Override + public void getCommandDescriptions( final CommandDescriptions descriptions ) + { + descriptions.add( NEW_BDV_VIEW, NEW_BDV_VIEW_KEYS, "Open a new BigDataViewer view." ); + descriptions.add( NEW_TRACKSCHEME_VIEW, NEW_TRACKSCHEME_VIEW_KEYS, "Open a new TrackScheme view." ); + descriptions.add( NEW_TABLE_VIEW, NEW_TABLE_VIEW_KEYS, "Open a new table view. " + + "The table displays the full data." ); + descriptions.add( NEW_SELECTION_TABLE_VIEW, NEW_SELECTION_TABLE_VIEW_KEYS, + "Open a new selection table view. " + + "The table only displays the current selection and " + + "is updated as the selection changes." ); + descriptions.add( PREFERENCES_DIALOG, PREFERENCES_DIALOG_KEYS, "Edit Mastodon preferences." ); + descriptions.add( TAGSETS_DIALOG, TAGSETS_DIALOG_KEYS, "Edit tag definitions." ); + descriptions.add( COMPUTE_FEATURE_DIALOG, COMPUTE_FEATURE_DIALOG_KEYS, + "Show the feature computation dialog." ); + descriptions.add( NEW_BRANCH_BDV_VIEW, NEW_BRANCH_BDV_VIEW_KEYS, "Open a new branch BigDataViewer view." ); + descriptions.add( NEW_BRANCH_TRACKSCHEME_VIEW, NEW_BRANCH_TRACKSCHEME_VIEW_KEYS, + "Open a new branch TrackScheme view." ); + descriptions.add( NEW_HIERARCHY_TRACKSCHEME_VIEW, NEW_HIERARCHY_TRACKSCHEME_VIEW_KEYS, + "Open a new hierarchy TrackScheme view." ); + descriptions.add( OPEN_ONLINE_DOCUMENTATION, OPEN_ONLINE_DOCUMENTATION_KEYS, + "Open the online documentation in a web browser." ); + descriptions.add( NEW_GRAPHER_VIEW, NEW_GRAPHER_VIEW_KEYS, "Open a new Grapher view." ); + } + } } diff --git a/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java b/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java index 30d7fb80d..474874a6a 100644 --- a/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java +++ b/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java @@ -57,6 +57,29 @@ public class MamutProjectIO private static final String TIME_UNITS_TAG = "TimeUnits"; + /** + * Returns a new project object for a new empty project operating on the + * image dataset specified by the BDV file. + * + * @param datasetXmlFile + * the path to the BDV file (the XML file). + * @return a new {@link MamutProject}. + */ + public static final MamutProject emptyProject( final File datasetXmlFile ) + { + return new MamutProject( null, datasetXmlFile ); + } + + /** + * Saves the project description via the specified project writer. + * + * @param project + * the project to save. + * @param writer + * the project writer. + * @throws IOException + * if an error occurs while writing the project description. + */ public static final void save( final MamutProject project, final MamutProject.ProjectWriter writer ) throws IOException { final Document doc = new Document( toXml( project ) ); @@ -67,6 +90,16 @@ public static final void save( final MamutProject project, final MamutProject.Pr os.close(); } + /** + * Load a Mamut project from a .mastodon file. + * + * @param projectPath + * the path to the .mastodon file. + * @return a new {@link MamutProject} pointing to the .mastodon + * file. + * @throws IOException + * if an error occurs while reading the project file. + */ public static final MamutProject load( final String projectPath ) throws IOException { final MamutProject project = new MamutProject( projectPath ); @@ -91,6 +124,21 @@ public static final MamutProject load( final String projectPath ) throws IOExcep return project; } + /** + * Serializes the specified project to a XML element. + *

+ * The serialized fields are: + *

    + *
  • the path to the dataset XML file. + *
  • whether the path above is relative. + *
  • the space physical units. + *
  • the time physical units. + *
+ * + * @param project + * the project to serialize. + * @return a new XML element. + */ public static final Element toXml( final MamutProject project ) { final Element root = new Element( MAMUTPROJECT_TAG ); @@ -102,6 +150,22 @@ public static final Element toXml( final MamutProject project ) return root; } + /** + * Deserializes some fields of the Mamut project from an XML element. + *

+ * The deserialized fields are: + *

    + *
  • the path to the dataset XML file. + *
  • whether the path above is relative. + *
  • the space physical units. + *
  • the time physical units. + *
+ * + * @param project + * the project. + * @param root + * the XML element. + */ public static final void fromXml( final MamutProject project, final Element root ) { project.setDatasetXmlFile( getDatasetPathFromXml( project, root ) ); diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java index 4b702cdb4..bfa552e56 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java @@ -53,6 +53,7 @@ import org.jdom2.JDOMException; import org.mastodon.app.MastodonIcons; +import org.mastodon.feature.FeatureSpecsService; import org.mastodon.mamut.MainWindow; import org.mastodon.mamut.ProjectManager; import org.mastodon.mamut.WindowManager; @@ -598,7 +599,8 @@ private void importMaMuT() final TrackMateImporter importer = new TrackMateImporter( file ); final WindowManager windowManager = createWindowManager(); windowManager.getProjectManager().open( importer.createProject() ); - importer.readModel( windowManager.getAppModel().getModel(), windowManager.getFeatureSpecsService() ); + final FeatureSpecsService featureSpecsService = context.getService( FeatureSpecsService.class ); + importer.readModel( windowManager.getAppModel().getModel(), featureSpecsService ); new MainWindow( windowManager ).setVisible( true ); dispose(); } @@ -631,8 +633,8 @@ private void loadMastodonProject( final String projectPath ) { // Use the the most recent opened location as initial // location for the file chooser - Iterator iterator = RecentProjectsPanel.recentProjects.iterator(); - String previousPath = iterator.hasNext() ? iterator.next() : null; + final Iterator iterator = RecentProjectsPanel.recentProjects.iterator(); + final String previousPath = iterator.hasNext() ? iterator.next() : null; // We have to use the JFileChooser to open folders. file = FileChooser.chooseFile( true, @@ -687,20 +689,21 @@ private class LauncherDropTarget extends DropTarget private static final long serialVersionUID = 1L; @Override - public synchronized void drop( DropTargetDropEvent dropTargetDropEvent ) + public synchronized void drop( final DropTargetDropEvent dropTargetDropEvent ) { try { dropTargetDropEvent.acceptDrop( DnDConstants.ACTION_COPY ); @SuppressWarnings( "unchecked" ) + final List< File > droppedFiles = ( List< File > ) dropTargetDropEvent.getTransferable().getTransferData( DataFlavor.javaFileListFlavor ); - for ( File file : droppedFiles ) + for ( final File file : droppedFiles ) { // process files loadMastodonProject( file.getAbsolutePath() ); } } - catch ( Exception e ) + catch ( final Exception e ) { e.printStackTrace( System.err ); } diff --git a/src/main/java/org/mastodon/mamut/plugin/MamutPlugin.java b/src/main/java/org/mastodon/mamut/plugin/MamutPlugin.java index c3adad690..a3d6b5977 100644 --- a/src/main/java/org/mastodon/mamut/plugin/MamutPlugin.java +++ b/src/main/java/org/mastodon/mamut/plugin/MamutPlugin.java @@ -29,6 +29,7 @@ package org.mastodon.mamut.plugin; import org.mastodon.app.plugin.MastodonPlugin; +import org.mastodon.mamut.MamutAppModel; -public interface MamutPlugin extends MastodonPlugin< MamutPluginAppModel > +public interface MamutPlugin extends MastodonPlugin< MamutAppModel > {} diff --git a/src/main/java/org/mastodon/mamut/plugin/MamutPluginAppModel.java b/src/main/java/org/mastodon/mamut/plugin/MamutPluginAppModel.java deleted file mode 100644 index 3d3268b81..000000000 --- a/src/main/java/org/mastodon/mamut/plugin/MamutPluginAppModel.java +++ /dev/null @@ -1,56 +0,0 @@ -/*- - * #%L - * Mastodon - * %% - * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ -package org.mastodon.mamut.plugin; - -import org.mastodon.app.plugin.MastodonAppPluginModel; -import org.mastodon.mamut.MamutAppModel; -import org.mastodon.mamut.WindowManager; - -public class MamutPluginAppModel implements MastodonAppPluginModel -{ - private final WindowManager windowManager; - - private final MamutAppModel appModel; - - public MamutPluginAppModel( final MamutAppModel appModel, final WindowManager windowManager ) - { - this.appModel = appModel; - this.windowManager = windowManager; - } - - public MamutAppModel getAppModel() - { - return appModel; - } - - public WindowManager getWindowManager() - { - return windowManager; - } -} diff --git a/src/main/java/org/mastodon/mamut/plugin/MamutPlugins.java b/src/main/java/org/mastodon/mamut/plugin/MamutPlugins.java index c0330330e..4138f22f1 100644 --- a/src/main/java/org/mastodon/mamut/plugin/MamutPlugins.java +++ b/src/main/java/org/mastodon/mamut/plugin/MamutPlugins.java @@ -29,9 +29,10 @@ package org.mastodon.mamut.plugin; import org.mastodon.app.plugin.MastodonPlugins; +import org.mastodon.mamut.MamutAppModel; import org.mastodon.ui.keymap.Keymap; -public class MamutPlugins extends MastodonPlugins< MamutPlugin, MamutPluginAppModel > +public class MamutPlugins extends MastodonPlugins< MamutPlugin, MamutAppModel > { public MamutPlugins( final Keymap keymap ) diff --git a/src/main/java/org/mastodon/mamut/plugin/MamutTestPlugin.java b/src/main/java/org/mastodon/mamut/plugin/MamutTestPlugin.java index 5296a8995..a4a5fc741 100644 --- a/src/main/java/org/mastodon/mamut/plugin/MamutTestPlugin.java +++ b/src/main/java/org/mastodon/mamut/plugin/MamutTestPlugin.java @@ -35,6 +35,7 @@ import java.util.Map; import org.mastodon.app.ui.ViewMenuBuilder; +import org.mastodon.mamut.MamutAppModel; import org.mastodon.mamut.MamutMenuBuilder; import org.mastodon.ui.keymap.CommandDescriptionProvider; import org.mastodon.ui.keymap.CommandDescriptions; @@ -67,9 +68,6 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) } } - @SuppressWarnings( "unused" ) - private MamutPluginAppModel appModel; - private static Map< String, String > menuTexts = new HashMap<>(); static @@ -109,8 +107,6 @@ public void installGlobalActions( final Actions actions ) } @Override - public void setAppPluginModel( final MamutPluginAppModel appModel ) - { - this.appModel = appModel; - } + public void setAppPluginModel( final MamutAppModel appModel ) + {} } diff --git a/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java b/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java index ca8a8d724..2ae185680 100644 --- a/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java +++ b/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java @@ -35,6 +35,7 @@ import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; +import org.mastodon.feature.FeatureSpecsService; import org.mastodon.mamut.WindowManager; import org.mastodon.mamut.importer.trackmate.TrackMateImporter; import org.mastodon.mamut.io.project.MamutProjectIO; @@ -64,12 +65,14 @@ public static void main( final String[] args ) throws ClassNotFoundException, In private static void importFromMaMuTAndSave( final File mamutFile, final File targetMastodonFile ) { - final WindowManager windowManager = new WindowManager( new Context() ); + final Context context = new Context(); + final WindowManager windowManager = new WindowManager( context ); try { final TrackMateImporter importer = new TrackMateImporter( mamutFile ); windowManager.getProjectManager().open( importer.createProject() ); - importer.readModel( windowManager.getAppModel().getModel(), windowManager.getFeatureSpecsService() ); + final FeatureSpecsService featureSpecsService = context.getService( FeatureSpecsService.class ); + importer.readModel( windowManager.getAppModel().getModel(), featureSpecsService ); } catch ( final IOException | SpimDataException e ) { From f1fdc9c8179418a443cc5a3458a23b12bea2206f Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Wed, 16 Aug 2023 11:10:04 +0200 Subject: [PATCH 004/220] Add missing classes from the WIP. --- .../java/org/mastodon/mamut/io/MamutIO.java | 197 +++++ .../mamut/io/MamutViewStateSerialization.java | 769 ++++++++++++++++++ 2 files changed, 966 insertions(+) create mode 100644 src/main/java/org/mastodon/mamut/io/MamutIO.java create mode 100644 src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java diff --git a/src/main/java/org/mastodon/mamut/io/MamutIO.java b/src/main/java/org/mastodon/mamut/io/MamutIO.java new file mode 100644 index 000000000..6cc9623d1 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/io/MamutIO.java @@ -0,0 +1,197 @@ +package org.mastodon.mamut.io; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.JDOMException; +import org.jdom2.input.SAXBuilder; +import org.mastodon.graph.io.RawGraphIO.FileIdToGraphMap; +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.feature.MamutRawFeatureModelIO; +import org.mastodon.mamut.io.project.MamutImagePlusProject; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.model.Link; +import org.mastodon.mamut.model.Model; +import org.mastodon.mamut.model.Spot; +import org.mastodon.ui.keymap.KeymapManager; +import org.mastodon.util.DummySpimData; +import org.mastodon.views.bdv.SharedBigDataViewerData; +import org.scijava.Context; +import org.scijava.ui.behaviour.KeyPressedManager; + +import ij.IJ; +import ij.ImagePlus; + +public class MamutIO +{ + + private static final String GUI_TAG = "MamutGui"; + private static final String WINDOWS_TAG = "Windows"; + + public static MamutAppModel open( final MamutProject project, final Context context ) throws IOException + { + return open( project, context, false ); + } + + public static MamutAppModel open( final MamutProject project, final Context context, final boolean restoreGUIState ) throws IOException + { + final Model model = loadModel( project, context ); + final SharedBigDataViewerData imageData = loadImageData( project ); + final KeyPressedManager keyPressedManager = new KeyPressedManager(); + final KeymapManager keymapManager = new KeymapManager(); + final MamutAppModel appModel = new MamutAppModel( context, model, imageData, keyPressedManager, keymapManager ); + + if ( restoreGUIState ) + loadGUI( project, appModel.getWindowManager() ); + + return appModel; + } + + public static SharedBigDataViewerData loadImageData( final MamutProject project ) + { + // Check whether the project points to a BDV file. + final String canonicalPath = project.getDatasetXmlFile().getAbsolutePath(); + if ( !canonicalPath.endsWith( ".xml" ) && !canonicalPath.endsWith( DummySpimData.DUMMY ) ) + { + final ImagePlus imp; + + // Do we have the ImagePlus already in memory? + if ( project instanceof MamutImagePlusProject ) + { + imp = ( ( MamutImagePlusProject ) project ).getImagePlus(); + } + else + { + // Assume the path points to a plain image file. + imp = IJ.openImage( canonicalPath ); + // If it does not work tell the user. + if ( imp == null ) + throw new IOException( "Cannot open image " + canonicalPath ); + } + } + else + { + // Opening a project with standard BDV (or DUMMY) image data + } + + /* + * Move this to AppModel + */ + +// // Prepare image data. +// // Prepare base view options. +// final ViewerOptions options = ViewerOptions.options() +// .shareKeyPressedEvents( windowManager.getKeyPressedManager() ) +// .msgOverlay( new MessageOverlayAnimator( 1500, 0.005, 0.02 ) ); +// +// final RequestRepaint requestRepaint = () -> windowManager.forEachBdvView( MamutViewBdv::requestRepaint ); + + // Is it based on ImagePlus? + if ( project instanceof MamutImagePlusProject ) + { + final MamutImagePlusProject mipp = ( MamutImagePlusProject ) project; + return SharedBigDataViewerData.fromImagePlus( mipp.getImagePlus(), options, requestRepaint ); + } + + // Open dummy data string? + final String spimDataXmlFilename = project.getDatasetXmlFile().getPath(); + if ( DummySpimData.isDummyString( spimDataXmlFilename ) ) + return SharedBigDataViewerData.fromDummyFilename( spimDataXmlFilename, options, requestRepaint ); + + // Open dummy data flag? + if ( dummyData ) + return openDummyImageData( project, options, requestRepaint ); + + return SharedBigDataViewerData.fromSpimDataXmlFile( project.getDatasetXmlFile().getAbsolutePath(), + options, + requestRepaint ); + } + + /** + * Loads a {@link Model} from a project file. + * + * @param project + * the project to load from. + * @param context + * the current context, used to get feature serializers. + * @return a new model. + * @throws IOException + * if there is a problem reading the project. + */ + public static final Model loadModel( final MamutProject project, final Context context ) throws IOException + { + final Model model = new Model( project.getSpaceUnits(), project.getTimeUnits() ); + final boolean isNewProject = project.getProjectRoot() == null; + if ( !isNewProject ) + { + try (final MamutProject.ProjectReader reader = project.openForReading()) + { + final FileIdToGraphMap< Spot, Link > idmap = model.loadRaw( reader ); + // Load features. + MamutRawFeatureModelIO.deserialize( + context, + model, + idmap, + reader ); + } + catch ( final ClassNotFoundException e ) + { + e.printStackTrace(); + } + } + + model.setSavePoint(); + model.declareDefaultFeatures(); + return model; + } + + /** + * Recreates the GUI configuration saved in the specified project. When + * calling this method, windows are created and shown on the display. + * + * @param project + * the project to read from. + * @param windowManager + * a window manager instance, used to create windows. + * @throws IOException + * if there is a problem reading the project. + */ + public static final void loadGUI( final MamutProject project, final WindowManager windowManager ) throws IOException + { + try (final MamutProject.ProjectReader reader = project.openForReading()) + { + try + { + + final SAXBuilder sax = new SAXBuilder(); + Document guiDoc; + try (InputStream inputStream = reader.getGuiInputStream()) + { + guiDoc = sax.build( inputStream ); + } + catch ( final JDOMException e ) + { + throw new IOException( e ); + } + final Element root = guiDoc.getRootElement(); + if ( !GUI_TAG.equals( root.getName() ) ) + throw new IOException( "expected <" + GUI_TAG + "> root element. wrong file?" ); + + final Element windowsEl = root.getChild( WINDOWS_TAG ); + if ( null == windowsEl ) + return; + + MamutViewStateSerialization.fromXml( windowsEl, windowManager ); + } + catch ( final FileNotFoundException fnfe ) + { + // Ignore missing gui file. + } + } + } + +} diff --git a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java new file mode 100644 index 000000000..17c0c2f0d --- /dev/null +++ b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java @@ -0,0 +1,769 @@ +/*- + * #%L + * Mastodon + * %% + * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ +package org.mastodon.mamut.io; + +import static org.mastodon.mamut.MamutBranchView.BRANCH_GRAPH; +import static org.mastodon.mamut.MamutView.COLORBAR_POSITION_KEY; +import static org.mastodon.mamut.MamutView.COLORBAR_VISIBLE_KEY; +import static org.mastodon.mamut.MamutView.FEATURE_COLOR_MODE_KEY; +import static org.mastodon.mamut.MamutView.FRAME_POSITION_KEY; +import static org.mastodon.mamut.MamutView.GROUP_HANDLE_ID_KEY; +import static org.mastodon.mamut.MamutView.NO_COLORING_KEY; +import static org.mastodon.mamut.MamutView.SETTINGS_PANEL_VISIBLE_KEY; +import static org.mastodon.mamut.MamutView.TAG_SET_KEY; +import static org.mastodon.mamut.MamutViewBdv.BDV_STATE_KEY; +import static org.mastodon.mamut.MamutViewBdv.BDV_TRANSFORM_KEY; +import static org.mastodon.mamut.MamutViewGrapher.GRAPHER_TRANSFORM_KEY; +import static org.mastodon.mamut.MamutViewTable.TABLE_DISPLAYED; +import static org.mastodon.mamut.MamutViewTable.TABLE_ELEMENT; +import static org.mastodon.mamut.MamutViewTable.TABLE_NAME; +import static org.mastodon.mamut.MamutViewTable.TABLE_SELECTION_ONLY; +import static org.mastodon.mamut.MamutViewTable.TABLE_VISIBLE_POS; +import static org.mastodon.mamut.MamutViewTrackScheme.TRACKSCHEME_TRANSFORM_KEY; + +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Point; +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import javax.swing.JViewport; + +import org.jdom2.Element; +import org.mastodon.app.IMastodonView; +import org.mastodon.app.ui.IMastodonFrameView; +import org.mastodon.mamut.MamutBranchViewBdv; +import org.mastodon.mamut.MamutBranchViewTrackScheme; +import org.mastodon.mamut.MamutView; +import org.mastodon.mamut.MamutViewBdv; +import org.mastodon.mamut.MamutViewGrapher; +import org.mastodon.mamut.MamutViewTable; +import org.mastodon.mamut.MamutViewTrackScheme; +import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.model.Link; +import org.mastodon.mamut.model.Spot; +import org.mastodon.mamut.model.branch.BranchLink; +import org.mastodon.mamut.model.branch.BranchSpot; +import org.mastodon.ui.coloring.ColoringModel; +import org.mastodon.ui.coloring.ColoringModelMain; +import org.mastodon.views.context.ContextChooser; +import org.mastodon.views.context.ContextProvider; +import org.mastodon.views.grapher.display.DataDisplayPanel; +import org.mastodon.views.table.FeatureTagTablePanel; +import org.mastodon.views.trackscheme.ScreenTransform; +import org.mastodon.views.trackscheme.display.ColorBarOverlay; +import org.mastodon.views.trackscheme.display.ColorBarOverlay.Position; +import org.mastodon.views.trackscheme.display.TrackSchemePanel; + +import mpicbg.spim.data.XmlHelpers; +import net.imglib2.realtransform.AffineGet; +import net.imglib2.realtransform.AffineTransform3D; + +/** + * Collection of constants and utilities related to de/serializing a GUI state. + */ +class MamutViewStateSerialization +{ + + static final String WINDOW_TAG = "Window"; + + /** + * Key to the view type name. Value is a string. + */ + static final String VIEW_TYPE_KEY = "Type"; + + /** + * Key that specifies the name of the chosen context provider. Values are + * strings. + */ + static final String CHOSEN_CONTEXT_PROVIDER_KEY = "ContextProvider"; + + /** + * Serializes a GUI state map into a XML element. + * + * @param guiState + * the GUI state to serialize. + * @return a new XML element. + */ + static < V extends IMastodonFrameView & IMastodonView > Element toXml( final V view ) + { + final Map< String, Object > guiState = getGuiState( view ); + final Element element = new Element( WINDOW_TAG ); + toXml( guiState, element ); + return element; + } + + static void toXml( final Map< String, Object > map, final Element element ) + { + for ( final Entry< String, Object > entry : map.entrySet() ) + { + final Element el = toXml( entry.getKey(), entry.getValue() ); + element.addContent( el ); + } + } + + @SuppressWarnings( "unchecked" ) + static Element toXml( final String key, final Object value ) + { + final Element el; + if ( value instanceof Integer ) + el = XmlHelpers.intElement( key, ( Integer ) value ); + else if ( value instanceof int[] ) + el = XmlHelpers.intArrayElement( key, ( int[] ) value ); + else if ( value instanceof Double ) + el = XmlHelpers.doubleElement( key, ( Double ) value ); + else if ( value instanceof double[] ) + el = XmlHelpers.doubleArrayElement( key, ( double[] ) value ); + else if ( value instanceof AffineGet ) + el = XmlHelpers.affineTransform3DElement( key, ( AffineGet ) value ); + else if ( value instanceof Boolean ) + el = XmlHelpers.booleanElement( key, ( Boolean ) value ); + else if ( value instanceof String ) + { + el = new Element( key ); + el.setText( value.toString() ); + } + else if ( value instanceof ScreenTransform ) + { + final ScreenTransform t = ( ScreenTransform ) value; + el = XmlHelpers.doubleArrayElement( key, new double[] { + t.getMinX(), + t.getMaxX(), + t.getMinY(), + t.getMaxY(), + t.getScreenWidth(), + t.getScreenHeight() + } ); + } + else if ( value instanceof org.mastodon.views.grapher.datagraph.ScreenTransform ) + { + final org.mastodon.views.grapher.datagraph.ScreenTransform t = + ( org.mastodon.views.grapher.datagraph.ScreenTransform ) value; + el = XmlHelpers.doubleArrayElement( key, new double[] { + t.getMinX(), + t.getMaxX(), + t.getMinY(), + t.getMaxY(), + t.getScreenWidth(), + t.getScreenHeight() + } ); + } + else if ( value instanceof Position ) + { + el = new Element( key ); + el.setText( ( ( Position ) value ).name() ); + } + else if ( value instanceof Element ) + { + el = new Element( key ); + el.setContent( ( Element ) value ); + } + else if ( value instanceof Map ) + { + el = new Element( key ); + toXml( ( Map< String, Object > ) value, el ); + } + else if ( value instanceof List ) + { + el = new Element( key ); + final List< Object > os = ( List< Object > ) value; + for ( final Object o : os ) + { + final Element child = toXml( key, o ); + el.addContent( child ); + } + } + else + { + System.err.println( "Do not know how to serialize object " + value + " for key " + key + "." ); + el = null; + } + return el; + } + + /** + * Wraps GUI state of a {@link MamutView} into a map. + * + * @param view + * the view. + * @return a new {@link Map}. + */ + private static < V extends IMastodonFrameView & IMastodonView > Map< String, Object > getGuiState( final V view ) + { + final Map< String, Object > guiState = new LinkedHashMap<>(); + + // View type. + guiState.put( VIEW_TYPE_KEY, view.getClass().getSimpleName() ); + + // Frame position and size. + final Rectangle bounds = view.getFrame().getBounds(); + guiState.put( FRAME_POSITION_KEY, new int[] { + ( int ) bounds.getMinX(), + ( int ) bounds.getMinY(), + ( int ) bounds.getWidth(), + ( int ) bounds.getHeight() } ); + + // Lock groups. + guiState.put( GROUP_HANDLE_ID_KEY, view.getGroupHandle().getGroupId() ); + + // Settings panel visibility. + guiState.put( SETTINGS_PANEL_VISIBLE_KEY, view.getFrame().isSettingsPanelVisible() ); + + // View-specifics. + if ( view instanceof MamutViewBdv ) + getGuiStateBdv( ( MamutViewBdv ) view, guiState ); + else if ( view instanceof MamutBranchViewBdv ) + getGuiStateBranchBdv( ( MamutBranchViewBdv ) view, guiState ); + else if ( view instanceof MamutViewTrackScheme ) + getGuiStateTrackScheme( ( MamutViewTrackScheme ) view, guiState ); + else if ( view instanceof MamutBranchViewTrackScheme ) + getGuiStateBranchTrackScheme( ( MamutBranchViewTrackScheme ) view, guiState ); + else if ( view instanceof MamutViewTable ) + getGuiStateTable( ( MamutViewTable ) view, guiState ); + else if ( view instanceof MamutViewGrapher ) + getGuiStateGrapher( ( MamutViewGrapher ) view, guiState ); + + return guiState; + } + + private static void getGuiStateGrapher( final MamutViewGrapher view, final Map< String, Object > guiState ) + { + final DataDisplayPanel< Spot, Link > dataDisplayPanel = view.getDataDisplayPanel(); + + // Transform. + final org.mastodon.views.grapher.datagraph.ScreenTransform t = dataDisplayPanel.getScreenTransform().get(); + guiState.put( GRAPHER_TRANSFORM_KEY, t ); + + // Coloring. + final ColoringModelMain< Spot, Link, BranchSpot, BranchLink > coloringModel = view.getColoringModel(); + getColoringState( coloringModel, guiState ); + + // Colorbar. + final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); + getColorBarOverlayState( colorBarOverlay, guiState ); + + // Context provider. + guiState.put( CHOSEN_CONTEXT_PROVIDER_KEY, view.getContextChooser().getChosenProvider().getName() ); + } + + /** + * Stores the {@link MamutViewTable} GUI state in the specified map. + * + * @param view + * the {@link MamutViewTable}. + * @param guiState + * the map to store info into. + */ + private static void getGuiStateTable( final MamutViewTable view, final Map< String, Object > guiState ) + { + // Selection table or not. + guiState.put( TABLE_SELECTION_ONLY, view.isSelectionTable() ); + + // Currently displayed table. + final FeatureTagTablePanel< ? > currentlyDisplayedTable = view.getFrame().getCurrentlyDisplayedTable(); + String displayedTableName = ""; + + // Table visible rectangles. + final List< FeatureTagTablePanel< ? > > tables = view.getFrame().getTables(); + final List< String > names = view.getFrame().getTableNames(); + final List< Map< String, Object > > tableGuiStates = new ArrayList<>( names.size() ); + for ( int i = 0; i < names.size(); i++ ) + { + final String name = names.get( i ); + final FeatureTagTablePanel< ? > table = tables.get( i ); + + if ( table == currentlyDisplayedTable ) + displayedTableName = name; + + final JViewport viewportVertex = table.getScrollPane().getViewport(); + final Point tableRect = viewportVertex.getViewPosition(); + + final LinkedHashMap< String, Object > tableGuiState = new LinkedHashMap<>(); + tableGuiState.put( TABLE_NAME, name ); + tableGuiState.put( TABLE_VISIBLE_POS, new int[] { + tableRect.x, + tableRect.y } ); + + tableGuiStates.add( tableGuiState ); + } + guiState.put( TABLE_ELEMENT, tableGuiStates ); + guiState.put( TABLE_DISPLAYED, displayedTableName ); + + // Coloring for core graph. + final ColoringModel coloringModel = view.getColoringModel(); + getColoringState( coloringModel, guiState ); + + // Coloring for branch-graph. + final ColoringModel branchColoringModel = view.getBranchColoringModel(); + final Map< String, Object > branchGraphMap = new HashMap<>(); + getColoringState( branchColoringModel, branchGraphMap ); + guiState.put( BRANCH_GRAPH, branchGraphMap ); + + // Context provider. + guiState.put( CHOSEN_CONTEXT_PROVIDER_KEY, view.getContextChooser().getChosenProvider().getName() ); + } + + /** + * Stores the {@link MamutViewTrackScheme} GUI state in the specified map. + * + * @param view + * the {@link MamutViewTrackScheme}. + * @param guiState + * the map to store info into. + */ + private static void getGuiStateTrackScheme( final MamutViewTrackScheme view, final Map< String, Object > guiState ) + { + final TrackSchemePanel trackschemePanel = view.getTrackschemePanel(); + + // Edit position to reflect the fact that we store the TrackScheme panel + // width and height. + final Point point = view.getFrame().getLocation(); + guiState.put( FRAME_POSITION_KEY, new int[] { + point.x, + point.y, + trackschemePanel.getDisplay().getWidth(), + trackschemePanel.getDisplay().getHeight() } ); + + // Transform. + final ScreenTransform t = trackschemePanel.getScreenTransform().get(); + guiState.put( TRACKSCHEME_TRANSFORM_KEY, t ); + + // Coloring. + final ColoringModelMain< Spot, Link, BranchSpot, BranchLink > coloringModel = view.getColoringModel(); + getColoringState( coloringModel, guiState ); + + // Colorbar. + final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); + getColorBarOverlayState( colorBarOverlay, guiState ); + + // Context provider. + guiState.put( CHOSEN_CONTEXT_PROVIDER_KEY, view.getContextChooser().getChosenProvider().getName() ); + } + + /** + * Stores the {@link MamutBranchViewTrackScheme} GUI state in the specified + * map. + * + * @param view + * the {@link MamutBranchViewTrackScheme}. + * @param guiState + * the map to store info into. + */ + private static void getGuiStateBranchTrackScheme( final MamutBranchViewTrackScheme view, + final Map< String, Object > guiState ) + { + final TrackSchemePanel trackschemePanel = view.getFrame().getTrackschemePanel(); + + // Edit position to reflect the fact that we store the TrackScheme panel + // width and height. + final Point point = view.getFrame().getLocation(); + guiState.put( FRAME_POSITION_KEY, new int[] { + point.x, + point.y, + trackschemePanel.getDisplay().getWidth(), + trackschemePanel.getDisplay().getHeight() } ); + + // Transform. + final ScreenTransform t = trackschemePanel.getScreenTransform().get(); + guiState.put( TRACKSCHEME_TRANSFORM_KEY, t ); + + // Coloring. + final ColoringModel coloringModel = view.getColoringModel(); + getColoringState( coloringModel, guiState ); + + // Colorbar. + final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); + getColorBarOverlayState( colorBarOverlay, guiState ); + } + + /** + * Stores the {@link MamutViewBdv} GUI state in the specified map. + * + * @param view + * the {@link MamutViewBdv}. + * @param guiState + * the map to store info into. + */ + private static void getGuiStateBdv( final MamutViewBdv view, final Map< String, Object > guiState ) + { + // Viewer state. + final Element stateEl = view.getViewerPanelMamut().stateToXml(); + guiState.put( BDV_STATE_KEY, stateEl ); + // Transform. + final AffineTransform3D t = new AffineTransform3D(); + view.getViewerPanelMamut().state().getViewerTransform( t ); + guiState.put( BDV_TRANSFORM_KEY, t ); + // Coloring. + final ColoringModel coloringModel = view.getColoringModel(); + getColoringState( coloringModel, guiState ); + // Colorbar. + final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); + getColorBarOverlayState( colorBarOverlay, guiState ); + } + + /** + * Stores the {@link MamutBranchViewBdv} GUI state in the specified map. + * + * @param view + * the {@link MamutViewBdv}. + * @param guiState + * the map to store info into. + */ + private static void getGuiStateBranchBdv( final MamutBranchViewBdv view, final Map< String, Object > guiState ) + { + // Viewer state. + final Element stateEl = view.getViewerPanelMamut().stateToXml(); + guiState.put( BDV_STATE_KEY, stateEl ); + // Transform. + final AffineTransform3D t = new AffineTransform3D(); + view.getViewerPanelMamut().state().getViewerTransform( t ); + guiState.put( BDV_TRANSFORM_KEY, t ); + // Coloring. + final ColoringModel coloringModel = view.getColoringModel(); + getColoringState( coloringModel, guiState ); + // Colorbar. + final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); + getColorBarOverlayState( colorBarOverlay, guiState ); + } + + /** + * Reads the coloring state of a view and stores it into the specified map. + * + * @param coloringModel + * the coloring model to read from. + * @param guiState + * the map to store it to. + */ + private static void getColoringState( final ColoringModel coloringModel, final Map< String, Object > guiState ) + { + final boolean noColoring = coloringModel.noColoring(); + guiState.put( NO_COLORING_KEY, noColoring ); + if ( !noColoring ) + if ( coloringModel.getTagSet() != null ) + guiState.put( TAG_SET_KEY, coloringModel.getTagSet().getName() ); + else if ( coloringModel.getFeatureColorMode() != null ) + guiState.put( FEATURE_COLOR_MODE_KEY, coloringModel.getFeatureColorMode().getName() ); + } + + private static void getColorBarOverlayState( final ColorBarOverlay colorBarOverlay, + final Map< String, Object > guiState ) + { + guiState.put( COLORBAR_VISIBLE_KEY, colorBarOverlay.isVisible() ); + guiState.put( COLORBAR_POSITION_KEY, colorBarOverlay.getPosition() ); + } + + /** + * Deserializes a GUI state from XML and recreate view windows as specified. + * + * @param windowsEl + * the XML element that stores the GUI state of a view. + * @param windowManager + * the application {@link WindowManager}. + */ + static void fromXml( final Element windowsEl, final WindowManager windowManager ) + { + // To deal later with context providers. + final Map< String, ContextProvider< Spot > > contextProviders = new HashMap<>(); + final Map< ContextChooser< Spot >, String > contextChosers = new HashMap<>(); + + final List< Element > viewEls = windowsEl.getChildren( WINDOW_TAG ); + for ( final Element viewEl : viewEls ) + { + final Map< String, Object > guiState = xmlToMap( viewEl ); + final String typeStr = ( String ) guiState.get( VIEW_TYPE_KEY ); + switch ( typeStr ) + { + case "MamutViewBdv": + { + try + { + final MamutViewBdv bdv = windowManager.createBigDataViewer( guiState ); + + // Store context provider. + contextProviders.put( bdv.getContextProvider().getName(), bdv.getContextProvider() ); + } + catch ( final IllegalArgumentException iae ) + { + System.err.println( "Info: Failed restoring state of a BigDataViewer window, thus not showing it.\n" + + " You may want to resave your project to replace the previous (failing) state with the current (okay) state." ); + } + break; + } + + case "MamutBranchViewBdv": + { + windowManager.createBranchBigDataViewer( guiState ); + break; + } + + case "MamutViewTrackScheme": + { + final MamutViewTrackScheme ts = windowManager.createTrackScheme( guiState ); + + // Deal with context chooser. + final String desiredProvider = ( String ) guiState.get( CHOSEN_CONTEXT_PROVIDER_KEY ); + if ( null != desiredProvider ) + contextChosers.put( ts.getContextChooser(), desiredProvider ); + break; + } + + case "MamutBranchViewTrackScheme": + { + windowManager.createBranchTrackScheme( guiState ); + break; + } + + case "MamutBranchViewTrackSchemeHierarchy": + { + windowManager.createHierarchyTrackScheme( guiState ); + break; + } + + case "MamutViewTable": + { + final MamutViewTable table = windowManager.createTable( guiState ); + + // Deal with context chooser. + final String desiredProvider = ( String ) guiState.get( CHOSEN_CONTEXT_PROVIDER_KEY ); + if ( null != desiredProvider ) + contextChosers.put( table.getContextChooser(), desiredProvider ); + break; + } + + case "MamutViewGrapher": + { + final MamutViewGrapher grapher = windowManager.createGrapher( guiState ); + + // Deal with context chooser. + final String desiredProvider = ( String ) guiState.get( CHOSEN_CONTEXT_PROVIDER_KEY ); + if ( null != desiredProvider ) + contextChosers.put( grapher.getContextChooser(), desiredProvider ); + break; + } + + default: + System.err.println( "Deserializing GUI state: Unknown window type: " + typeStr + "." ); + continue; + } + } + + /* + * Loop again on context choosers and try to give them their desired + * context provider. + */ + + for ( final ContextChooser< Spot > contextChooser : contextChosers.keySet() ) + { + final String desiredContextProvider = contextChosers.get( contextChooser ); + final ContextProvider< Spot > contextProvider = contextProviders.get( desiredContextProvider ); + if ( null != contextProvider ) + contextChooser.choose( contextProvider ); + } + } + + private static Map< String, Object > xmlToMap( final Element viewEl ) + { + final Map< String, Object > guiState = new HashMap<>(); + final List< Element > children = viewEl.getChildren(); + for ( final Element el : children ) + { + final String key = el.getName(); + final Object value; + switch ( key ) + { + case BDV_STATE_KEY: + value = el; + break; + case BDV_TRANSFORM_KEY: + value = XmlHelpers.getAffineTransform3D( viewEl, key ); + break; + case FRAME_POSITION_KEY: + final int[] pos = XmlHelpers.getIntArray( viewEl, key ); + value = sanitize( pos ); + break; + case TAG_SET_KEY: + case FEATURE_COLOR_MODE_KEY: + case VIEW_TYPE_KEY: + case CHOSEN_CONTEXT_PROVIDER_KEY: + value = el.getTextTrim(); + break; + case TRACKSCHEME_TRANSFORM_KEY: + { + final double[] arr = XmlHelpers.getDoubleArray( viewEl, key ); + value = new ScreenTransform( arr[ 0 ], arr[ 1 ], arr[ 2 ], arr[ 3 ], ( int ) arr[ 4 ], + ( int ) arr[ 5 ] ); + break; + } + case GRAPHER_TRANSFORM_KEY: + { + final double[] arr = XmlHelpers.getDoubleArray( viewEl, key ); + value = new org.mastodon.views.grapher.datagraph.ScreenTransform( arr[ 0 ], arr[ 1 ], arr[ 2 ], + arr[ 3 ], ( int ) arr[ 4 ], ( int ) arr[ 5 ] ); + break; + } + case TABLE_SELECTION_ONLY: + case NO_COLORING_KEY: + case SETTINGS_PANEL_VISIBLE_KEY: + case COLORBAR_VISIBLE_KEY: + value = XmlHelpers.getBoolean( viewEl, key ); + break; + case COLORBAR_POSITION_KEY: + final String str = XmlHelpers.getText( viewEl, key ); + value = Position.valueOf( str ); + break; + case GROUP_HANDLE_ID_KEY: + { + value = XmlHelpers.getInt( viewEl, key ); + break; + } + case TABLE_ELEMENT: + { + final List< Element > els = el.getChildren(); + final List< Map< String, Object > > maps = new ArrayList<>( els.size() ); + for ( final Element child : els ) + { + final String name = child.getChildTextTrim( TABLE_NAME ); + final int[] tablePos = XmlHelpers.getIntArray( child, TABLE_VISIBLE_POS ); + final Map< String, Object > m = new HashMap<>(); + m.put( TABLE_NAME, name ); + m.put( TABLE_VISIBLE_POS, tablePos ); + maps.add( m ); + } + value = maps; + break; + } + case TABLE_DISPLAYED: + value = XmlHelpers.getText( viewEl, TABLE_DISPLAYED ); + break; + case BRANCH_GRAPH: + value = xmlToMap( el ); + break; + default: + System.err.println( "Unknown GUI config parameter: " + key + " found in GUI file." ); + continue; + } + guiState.put( key, value ); + } + return guiState; + } + + private static final int MIN_WIDTH = 200; + + private static final int MIN_HEIGHT = MIN_WIDTH; + + /** + * Makes sure the specified position array won't end in creating windows + * off-screen. We impose that a window is fully on *one* screen and not + * split over severals. We also impose a minimal size for the windows. + *

+ * The pos array is { x, y, width, height }. + * + * @param pos + * the position array. + * @return the same position array. + */ + private static int[] sanitize( final int[] pos ) + { + assert pos.length == 4; + final GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + if ( null == ge ) + return pos; + final GraphicsDevice sd[] = ge.getScreenDevices(); + if ( sd.length < 1 ) + return pos; + + // Window min size. + pos[ 2 ] = Math.max( MIN_WIDTH, pos[ 2 ] ); + pos[ 3 ] = Math.max( MIN_HEIGHT, pos[ 3 ] ); + + for ( final GraphicsDevice gd : sd ) + { + final Rectangle bounds = gd.getDefaultConfiguration().getBounds(); + if ( bounds.contains( pos[ 0 ], pos[ 1 ], pos[ 2 ], pos[ 3 ] ) ) + // Fully in a screen, nothing to do. + return pos; + + if ( bounds.contains( pos[ 0 ], pos[ 1 ] ) ) + { + /* + * This window is on this screen, but exits it. First resize it + * so that it is not bigger than the screen. + */ + pos[ 2 ] = Math.min( bounds.width, pos[ 2 ] ); + pos[ 3 ] = Math.min( bounds.height, pos[ 3 ] ); + + /* + * Then move it back so that its bottom right corner is in the + * screen. + */ + if ( pos[ 0 ] + pos[ 2 ] > bounds.x + bounds.width ) + pos[ 0 ] -= ( pos[ 0 ] - bounds.x + pos[ 2 ] - bounds.width ); + + if ( pos[ 1 ] + pos[ 3 ] > bounds.y + bounds.height ) + pos[ 1 ] -= ( pos[ 1 ] - bounds.y + pos[ 3 ] - bounds.height ); + + return pos; + } + } + + /* + * Ok we did not find a screen in which this window is. So we will put + * it in the first screen. + */ + final Rectangle bounds = sd[ 0 ].getDefaultConfiguration().getBounds(); + pos[ 0 ] = Math.max( bounds.x, + Math.min( bounds.x + bounds.width - pos[ 2 ], pos[ 0 ] ) ); + pos[ 1 ] = Math.max( bounds.y, + Math.min( bounds.y + bounds.height - pos[ 3 ], pos[ 1 ] ) ); + + if ( bounds.contains( pos[ 0 ], pos[ 1 ], pos[ 2 ], pos[ 3 ] ) ) + // Fully in a screen, nothing to do. + return pos; + + /* + * This window is on this screen, but exits it. First resize it so that + * it is not bigger than the screen. + */ + pos[ 2 ] = Math.min( bounds.width, pos[ 2 ] ); + pos[ 3 ] = Math.min( bounds.height, pos[ 3 ] ); + + /* + * Then move it back so that its bottom right corner is in the screen. + */ + pos[ 0 ] -= ( pos[ 0 ] - bounds.x + pos[ 2 ] - bounds.width ); + pos[ 1 ] -= ( pos[ 1 ] - bounds.y + pos[ 3 ] - bounds.height ); + + return pos; + } +} From 169eb9a70c2de7168cb7c78efc0d6d957e93ca66 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Wed, 16 Aug 2023 19:02:52 +0200 Subject: [PATCH 005/220] Rework project loading / saving. This branch reflects an effort to rework the main class of the Mamut app: the MamutAppModel. The main goal is to make the app model the core of a Mastodon session, and have all of its fields final, and have them containing everything we need to run all featuures of the app. This is a WIP but so far we have: - The windowManager is now a field of the app model. - The app model is immutable: it cannot change under the user feet. When a user loads a project, it gets another instance, but cannot modify an existing one. - And to do this, the main work of this PR is the rework of the project loading and saving, detailed a bit below. The ProjectManager class is gone, replaced by 4 classes with only static methods, in the package org.mastodon.mamut.io. Each one takes care about loading, saving, importing or exporting. The loading methods all produces a new MamutAppModel instance. This instance receives the MamutProject it was created on (handy to save it later). The app model is properly initiatialized ONCE with everything. Then a consumer can create a MainWindow to pilot it. I have updated all the classes so that they compile. The tests all run (except for the garbage collection from Mathias, which requires changing two deps). But I am anxious to see if we cover all the use cases below: - [x] open a project - [ ] save a modified project - [x] 'save as' a project - [ ] test that we can reload a saved project - [ ] test that we can reload a 'saved as' project The importers and exporters work, as seen by the tests, but I would like to test them and rework their UI. Then I will rework again the app model, rename it etc... --- .../org/mastodon/mamut/DumpInputConfig.java | 17 +- .../java/org/mastodon/mamut/MainWindow.java | 60 +- .../org/mastodon/mamut/MamutAppModel.java | 25 +- .../org/mastodon/mamut/MamutBranchView.java | 2 +- .../mastodon/mamut/MamutBranchViewBdv.java | 2 +- .../mamut/MamutBranchViewTrackScheme.java | 2 +- .../org/mastodon/mamut/MamutMenuBuilder.java | 19 +- .../java/org/mastodon/mamut/MamutView.java | 2 +- .../java/org/mastodon/mamut/MamutViewBdv.java | 3 +- .../org/mastodon/mamut/MamutViewGrapher.java | 2 +- .../org/mastodon/mamut/MamutViewTable.java | 2 +- .../mastodon/mamut/MamutViewTrackScheme.java | 2 +- .../org/mastodon/mamut/ProjectManager.java | 1164 ----------------- .../org/mastodon/mamut/WindowManager.java | 16 - .../java/org/mastodon/mamut/io/MamutIO.java | 197 --- .../org/mastodon/mamut/io/ProjectActions.java | 101 ++ .../org/mastodon/mamut/io/ProjectCreator.java | 202 +++ .../mastodon/mamut/io/ProjectExporter.java | 70 + .../mastodon/mamut/io/ProjectImporter.java | 105 ++ .../org/mastodon/mamut/io/ProjectLoader.java | 532 ++++++++ .../org/mastodon/mamut/io/ProjectSaver.java | 393 ++++++ .../mamut/io/project/MamutProjectIO.java | 16 +- .../mamut/launcher/MastodonDndLauncher.java | 38 +- .../mamut/launcher/MastodonLauncher.java | 80 +- .../org/mastodon/ui/util/FileChooser.java | 14 - .../views/bdv/SharedBigDataViewerData.java | 54 +- .../style/DataDisplayStyleManager.java | 4 +- .../mastodon/StartMastodonDefaultProject.java | 13 + .../org/mastodon/StartMastodonOnProject.java | 48 +- .../mastodon/graph/BranchGraphExample.java | 12 +- .../org/mastodon/mamut/CloseListenerTest.java | 22 +- .../mastodon/mamut/GarbageCollectionTest.java | 18 +- .../org/mastodon/mamut}/MamutPlayground.java | 15 +- .../mastodon/mamut/ProjectManagerTest.java | 32 +- .../StartMastodonWithMissingImageDemo.java | 6 +- .../feature/RawDeserializationExample.java | 17 +- .../feature/SerializeFeatureExample.java | 22 +- .../mamut/feature/SpotIntensityBenchmark.java | 21 +- .../feature/SpotIntensityUpdateExample.java | 14 +- .../ui/FeatureColorModeConfigPageDemo.java | 2 +- .../mamut/importer/MaMuTExportExample.java | 16 +- .../mamut/importer/MaMuTImporterExample.java | 56 +- .../importer/trackmate/MaMuTExporterTest.java | 5 +- .../mamut/project/MamutProjectIOTest.java | 8 +- .../mamut/tags/PlayingWithTagsExample.java | 9 +- .../mastodon/util/GarbageCollectionUtils.java | 18 +- .../java/org/mastodon/util/MastodonUtils.java | 77 +- 47 files changed, 1792 insertions(+), 1763 deletions(-) delete mode 100644 src/main/java/org/mastodon/mamut/ProjectManager.java delete mode 100644 src/main/java/org/mastodon/mamut/io/MamutIO.java create mode 100644 src/main/java/org/mastodon/mamut/io/ProjectActions.java create mode 100644 src/main/java/org/mastodon/mamut/io/ProjectCreator.java create mode 100644 src/main/java/org/mastodon/mamut/io/ProjectExporter.java create mode 100644 src/main/java/org/mastodon/mamut/io/ProjectImporter.java create mode 100644 src/main/java/org/mastodon/mamut/io/ProjectLoader.java create mode 100644 src/main/java/org/mastodon/mamut/io/ProjectSaver.java create mode 100644 src/test/java/org/mastodon/StartMastodonDefaultProject.java rename src/{main/java/org/mastodon/mamut/feature => test/java/org/mastodon/mamut}/MamutPlayground.java (89%) diff --git a/src/main/java/org/mastodon/mamut/DumpInputConfig.java b/src/main/java/org/mastodon/mamut/DumpInputConfig.java index 7003f5099..c03b21fb6 100644 --- a/src/main/java/org/mastodon/mamut/DumpInputConfig.java +++ b/src/main/java/org/mastodon/mamut/DumpInputConfig.java @@ -28,12 +28,14 @@ */ package org.mastodon.mamut; -import java.io.File; +import static org.mastodon.io.IOUtils.mkdirs; + import java.io.IOException; import java.util.List; import org.mastodon.app.ui.CloseWindowActions; import org.mastodon.app.ui.MastodonFrameViewActions; +import org.mastodon.mamut.io.ProjectActions; import org.mastodon.ui.EditTagActions; import org.mastodon.ui.FocusActions; import org.mastodon.ui.HighlightBehaviours; @@ -57,19 +59,16 @@ import org.scijava.ui.behaviour.io.InputTriggerDescriptionsBuilder; import org.scijava.ui.behaviour.io.yaml.YamlConfigIO; +import bdv.ui.keymap.Keymap; + public class DumpInputConfig { - static boolean mkdirs( final String fileName ) - { - final File dir = new File( fileName ).getParentFile(); - return dir != null && dir.mkdirs(); - } - public static void writeToYaml( final String fileName, final WindowManager wm ) throws IOException + public static void writeToYaml( final String fileName, final Keymap keymap ) throws IOException { mkdirs( fileName ); final List< InputTriggerDescription > descriptions = - new InputTriggerDescriptionsBuilder( wm.getAppModel().getKeymap().getConfig() ).getDescriptions(); + new InputTriggerDescriptionsBuilder( keymap.getConfig() ).getDescriptions(); YamlConfigIO.write( descriptions, fileName ); } @@ -88,7 +87,7 @@ private static CommandDescriptions buildCommandDescriptions( final Context conte context.inject( builder ); builder.addManually( new CloseWindowActions.Descriptions(), KeyConfigContexts.MASTODON ); - builder.addManually( new ProjectManager.Descriptions(), KeyConfigContexts.MASTODON ); + builder.addManually( new ProjectActions.Descriptions(), KeyConfigContexts.MASTODON ); builder.addManually( new UndoActions.Descriptions(), KeyConfigContexts.MASTODON ); builder.addManually( new SelectionActions.Descriptions(), KeyConfigContexts.MASTODON ); builder.addManually( new WindowManager.Descriptions(), KeyConfigContexts.MASTODON ); diff --git a/src/main/java/org/mastodon/mamut/MainWindow.java b/src/main/java/org/mastodon/mamut/MainWindow.java index 9633ce862..9a4b2c8e1 100644 --- a/src/main/java/org/mastodon/mamut/MainWindow.java +++ b/src/main/java/org/mastodon/mamut/MainWindow.java @@ -45,7 +45,6 @@ import java.awt.BorderLayout; import java.awt.Font; import java.awt.Graphics; -import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; @@ -65,6 +64,7 @@ import org.mastodon.app.MastodonIcons; import org.mastodon.app.ui.ViewMenu; +import org.mastodon.mamut.io.ProjectActions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.ui.keymap.Keymap; @@ -78,14 +78,20 @@ public class MainWindow extends JFrame private final ViewMenu menu; - public MainWindow( final WindowManager windowManager ) + private final MamutAppModel appModel; + + public MainWindow( final MamutAppModel appModel ) { super( "Mastodon" ); + this.appModel = appModel; setIconImages( MASTODON_ICON ); setLocationByPlatform( true ); setLocationRelativeTo( null ); - final ActionMap actionMap = windowManager.getGlobalAppActions().getActionMap(); + // Re-register save actions, this time using this frame as parent component. + ProjectActions.installAppActions( appModel.getAppActions(), appModel, this ); + + final ActionMap actionMap = appModel.getAppActions().getActionMap(); final JPanel buttonsPanel = new JPanel(); buttonsPanel.setLayout( new MigLayout() ); @@ -137,11 +143,11 @@ public MainWindow( final WindowManager windowManager ) ioLabel.setFont( buttonsPanel.getFont().deriveFont( Font.BOLD ) ); buttonsPanel.add( ioLabel, "span, wrap" ); - final JButton saveProjectButton = new JButton( actionMap.get( ProjectManager.SAVE_PROJECT ) ); + final JButton saveProjectButton = new JButton( actionMap.get( ProjectActions.SAVE_PROJECT ) ); prepareButton( saveProjectButton, "save", SAVE_ICON_MEDIUM ); buttonsPanel.add( saveProjectButton, "grow" ); - final JButton loadProjectButton = new JButton( actionMap.get( ProjectManager.SAVE_PROJECT_AS ) ); + final JButton loadProjectButton = new JButton( actionMap.get( ProjectActions.SAVE_PROJECT_AS ) ); prepareButton( loadProjectButton, "save as...", SAVE_AS_ICON_MEDIUM ); buttonsPanel.add( loadProjectButton, "grow, wrap" ); @@ -169,11 +175,11 @@ public void paintComponent( final Graphics g ) menubar = new JMenuBar(); setJMenuBar( menubar ); - final Keymap keymap = windowManager.getKeymapManager().getForwardDefaultKeymap(); + final Keymap keymap = appModel.getKeymapManager().getForwardDefaultKeymap(); menu = new ViewMenu( menubar, keymap, KeyConfigContexts.MASTODON ); keymap.updateListeners().add( menu::updateKeymap ); addMenus( menu, actionMap ); - windowManager.getPlugins().addMenus( menu ); + appModel.getPlugins().addMenus( menu ); setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE ); addWindowListener( new WindowAdapter() @@ -181,7 +187,7 @@ public void paintComponent( final Graphics g ) @Override public void windowClosing( final WindowEvent e ) { - close( windowManager, actionMap.get( ProjectManager.SAVE_PROJECT ), e ); + close(); } } ); @@ -195,20 +201,14 @@ public void windowClosing( final WindowEvent e ) * Returns true if Mastodon has been closed, or * false if the user canceled closing. * - * @param windowManager - * the Mastodon window manager controlled in this windown. - * @param saveAction - * the action that saves the Mastodon file. - * @param trigger - * the event that triggered this action. * @return true if the Mastodon instance has been closed. */ - public boolean close( final WindowManager windowManager, final Action saveAction, final WindowEvent trigger ) + public boolean close() { - if ( windowManager != null && windowManager.getAppModel() == null - || windowManager.getAppModel().getModel().isSavePoint() ) + final Action saveAction = appModel.getAppActions().getActionMap().get( ProjectActions.SAVE_PROJECT ); + if ( appModel.getModel().isSavePoint() ) { - windowManager.dispose(); + appModel.close(); dispose(); return true; } @@ -236,13 +236,11 @@ public boolean close( final WindowManager windowManager, final Action saveAction return false; case JOptionPane.YES_OPTION: - saveAction - .actionPerformed( new ActionEvent( trigger.getSource(), trigger.getID(), trigger.paramString() ) ); + saveAction.actionPerformed( null ); // Fall trough to closing. case JOptionPane.NO_OPTION: - if ( windowManager != null ) - windowManager.dispose(); + appModel.close(); dispose(); } return true; @@ -262,16 +260,16 @@ public static void addMenus( final ViewMenu menu, final ActionMap actionMap ) { MamutMenuBuilder.build( menu, actionMap, fileMenu( - // item( ProjectManager.CREATE_PROJECT ), - // item( ProjectManager.CREATE_PROJECT_FROM_URL ), - // item( ProjectManager.LOAD_PROJECT ), - item( ProjectManager.SAVE_PROJECT ), - item( ProjectManager.SAVE_PROJECT_AS ), + // item( ProjectActions.CREATE_PROJECT ), + // item( ProjectActions.CREATE_PROJECT_FROM_URL ), + // item( ProjectActions.LOAD_PROJECT ), + item( ProjectActions.SAVE_PROJECT ), + item( ProjectActions.SAVE_PROJECT_AS ), separator(), - // item( ProjectManager.IMPORT_TGMM ), - // item( ProjectManager.IMPORT_SIMI ), - // item( ProjectManager.IMPORT_MAMUT ), - // item( ProjectManager.EXPORT_MAMUT ), + // item( ProjectActions.IMPORT_TGMM ), + // item( ProjectActions.IMPORT_SIMI ), + // item( ProjectActions.IMPORT_MAMUT ), + // item( ProjectActions.EXPORT_MAMUT ), // separator(), item( WindowManager.PREFERENCES_DIALOG ), separator(), diff --git a/src/main/java/org/mastodon/mamut/MamutAppModel.java b/src/main/java/org/mastodon/mamut/MamutAppModel.java index c1b737080..dedc09164 100644 --- a/src/main/java/org/mastodon/mamut/MamutAppModel.java +++ b/src/main/java/org/mastodon/mamut/MamutAppModel.java @@ -32,6 +32,8 @@ import org.mastodon.app.MastodonAppModel; import org.mastodon.app.plugin.MastodonAppPluginModel; +import org.mastodon.mamut.io.ProjectActions; +import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.model.BoundingSphereRadiusStatistics; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; @@ -52,6 +54,8 @@ import org.scijava.ui.behaviour.KeyPressedManager; import org.scijava.ui.behaviour.util.Actions; +import bdv.viewer.animate.MessageOverlayAnimator; + /** * Data class that stores the data model and the application model of the MaMuT * application. @@ -78,12 +82,15 @@ public class MamutAppModel extends MastodonAppModel< Model, Spot, Link > impleme private final Context context; + private final MamutProject project; + public MamutAppModel( final Context context, final Model model, final SharedBigDataViewerData sharedBdvData, final KeyPressedManager keyPressedManager, - final KeymapManager keymapManager ) + final KeymapManager keymapManager, + final MamutProject project ) { super( NUM_GROUPS, @@ -95,6 +102,7 @@ public MamutAppModel( new String[] { KeyConfigContexts.MASTODON } ); this.context = context; + this.project = project; this.radiusStats = new BoundingSphereRadiusStatistics( model ); this.sharedBdvData = sharedBdvData; this.minTimepoint = 0; @@ -106,6 +114,9 @@ public MamutAppModel( getAppActions().updateKeyConfig( keymap.getConfig() ); } ); + // Register save / export actions + ProjectActions.installAppActions( getAppActions(), this, null ); + this.branchGraphSync = new BranchGraphSynchronizer( model.getBranchGraph(), model.getGraph().getLock().readLock() ); model.getGraph().addGraphChangeListener( branchGraphSync ); /* @@ -118,10 +129,14 @@ public MamutAppModel( // WindowManager. this.windowManager = new WindowManager( this ); + // Update sharedBdvData + sharedBdvData.getOptions() + .shareKeyPressedEvents( keyPressedManager ) + .msgOverlay( new MessageOverlayAnimator( 1500, 0.005, 0.02 ) ); + // Plugins. discoverPlugins(); - // Install common actions. UndoActions.install( getAppActions(), model ); SelectionActions.install( getAppActions(), model.getGraph(), model.getGraph().getLock(), model.getGraph(), getSelectionModel(), model ); @@ -166,6 +181,7 @@ public BranchGraphSynchronizer getBranchGraphSync() public void close() { closeListeners.list.forEach( CloseListener::close ); + windowManager.closeAllWindows(); } /** @@ -199,4 +215,9 @@ private void discoverPlugins() } plugins.setAppPluginModel( this ); } + + public MamutProject getProject() + { + return project; + } } diff --git a/src/main/java/org/mastodon/mamut/MamutBranchView.java b/src/main/java/org/mastodon/mamut/MamutBranchView.java index 768b02414..ff229b892 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchView.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchView.java @@ -243,7 +243,7 @@ protected final ColoringModel registerBranchColoring( final Runnable refresh ) { final FeatureModel featureModel = appModel.getModel().getFeatureModel(); - final FeatureColorModeManager featureColorModeManager = appModel.getFeatureColorModeManager(); + final FeatureColorModeManager featureColorModeManager = appModel.getWindowManager().getFeatureColorModeManager(); final ColoringModelBranchGraph< ?, ? > coloringModel = new ColoringModelBranchGraph<>( tagSetModel, featureColorModeManager, featureModel ); final ColoringMenu coloringMenu = new ColoringMenu( menuHandle.getMenu(), coloringModel ); diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java index 08f68f214..610720125 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java @@ -268,7 +268,7 @@ public MamutBranchViewBdv( final MamutAppModel appModel, final Map< String, Obje timepointModel.listeners().add( () -> viewer.setTimepoint( timepointModel.getTimepoint() ) ); // Render settings. - final RenderSettings renderSettings = appModel.getRenderSettingsManager().getForwardDefaultStyle(); + final RenderSettings renderSettings = appModel.getWindowManager().getRenderSettingsManager().getForwardDefaultStyle(); tracksOverlay.setRenderSettings( renderSettings ); final UpdateListener updateListener = () -> viewer.repaint(); renderSettings.updateListeners().add( updateListener ); diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java index 33b6f359b..284382ff8 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java @@ -126,7 +126,7 @@ protected MamutBranchViewTrackScheme( // TrackScheme options. final GraphColorGeneratorAdapter< BranchSpot, BranchLink, TrackSchemeVertex, TrackSchemeEdge > coloringAdapter = new GraphColorGeneratorAdapter<>( viewGraph.getVertexMap(), viewGraph.getEdgeMap() ); - final TrackSchemeStyle forwardDefaultStyle = appModel.getTrackSchemeStyleManager().getForwardDefaultStyle(); + final TrackSchemeStyle forwardDefaultStyle = appModel.getWindowManager().getTrackSchemeStyleManager().getForwardDefaultStyle(); final TrackSchemeOptions options = TrackSchemeOptions.options() .trackSchemeOverlayFactory( overlayFactory ) .lineageTreeLayoutFactory( lineageTreeLayoutFactory ) diff --git a/src/main/java/org/mastodon/mamut/MamutMenuBuilder.java b/src/main/java/org/mastodon/mamut/MamutMenuBuilder.java index 278096d5a..62b9c01b8 100644 --- a/src/main/java/org/mastodon/mamut/MamutMenuBuilder.java +++ b/src/main/java/org/mastodon/mamut/MamutMenuBuilder.java @@ -37,6 +37,7 @@ import org.mastodon.app.ui.MastodonFrameViewActions; import org.mastodon.app.ui.ViewMenu; import org.mastodon.app.ui.ViewMenuBuilder; +import org.mastodon.mamut.io.ProjectActions; import org.mastodon.ui.SelectionActions; import org.mastodon.views.bdv.export.RecordMaxProjectionMovieDialog; import org.mastodon.views.bdv.export.RecordMovieDialog; @@ -53,15 +54,15 @@ public class MamutMenuBuilder extends ViewMenuBuilder static { - menuTexts.put( ProjectManager.CREATE_PROJECT, "New Project" ); - menuTexts.put( ProjectManager.CREATE_PROJECT_FROM_URL, "New Project From URL" ); - menuTexts.put( ProjectManager.LOAD_PROJECT, "Load Project" ); - menuTexts.put( ProjectManager.SAVE_PROJECT, "Save Project" ); - menuTexts.put( ProjectManager.SAVE_PROJECT_AS, "Save Project As..." ); - menuTexts.put( ProjectManager.IMPORT_TGMM, "Import TGMM tracks" ); - menuTexts.put( ProjectManager.IMPORT_SIMI, "Import Simi BioCell tracks" ); - menuTexts.put( ProjectManager.IMPORT_MAMUT, "Import MaMuT project" ); - menuTexts.put( ProjectManager.EXPORT_MAMUT, "Export MaMuT project" ); + menuTexts.put( ProjectActions.CREATE_PROJECT, "New Project" ); + menuTexts.put( ProjectActions.CREATE_PROJECT_FROM_URL, "New Project From URL" ); + menuTexts.put( ProjectActions.LOAD_PROJECT, "Load Project" ); + menuTexts.put( ProjectActions.SAVE_PROJECT, "Save Project" ); + menuTexts.put( ProjectActions.SAVE_PROJECT_AS, "Save Project As..." ); + menuTexts.put( ProjectActions.IMPORT_TGMM, "Import TGMM tracks" ); + menuTexts.put( ProjectActions.IMPORT_SIMI, "Import Simi BioCell tracks" ); + menuTexts.put( ProjectActions.IMPORT_MAMUT, "Import MaMuT project" ); + menuTexts.put( ProjectActions.EXPORT_MAMUT, "Export MaMuT project" ); menuTexts.put( WindowManager.OPEN_ONLINE_DOCUMENTATION, "Open online documentation" ); diff --git a/src/main/java/org/mastodon/mamut/MamutView.java b/src/main/java/org/mastodon/mamut/MamutView.java index ad3a92e2a..d1b5ff790 100644 --- a/src/main/java/org/mastodon/mamut/MamutView.java +++ b/src/main/java/org/mastodon/mamut/MamutView.java @@ -156,7 +156,7 @@ protected ColoringModelMain< Spot, Link, BranchSpot, BranchLink > registerColori { final TagSetModel< Spot, Link > tagSetModel = appModel.getModel().getTagSetModel(); final FeatureModel featureModel = appModel.getModel().getFeatureModel(); - final FeatureColorModeManager featureColorModeManager = appModel.getFeatureColorModeManager(); + final FeatureColorModeManager featureColorModeManager = appModel.getWindowManager().getFeatureColorModeManager(); final ModelBranchGraph branchGraph = appModel.getModel().getBranchGraph(); final ColoringModelMain< Spot, Link, BranchSpot, BranchLink > coloringModel = new ColoringModelMain<>( tagSetModel, featureColorModeManager, featureModel, branchGraph ); diff --git a/src/main/java/org/mastodon/mamut/MamutViewBdv.java b/src/main/java/org/mastodon/mamut/MamutViewBdv.java index f7752c7eb..08c5b25cc 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutViewBdv.java @@ -290,7 +290,7 @@ public MamutViewBdv( final MamutAppModel appModel, final Map< String, Object > g viewer.timePointListeners().add( timePointIndex -> timepointModel.setTimepoint( timePointIndex ) ); timepointModel.listeners().add( () -> viewer.setTimepoint( timepointModel.getTimepoint() ) ); - final RenderSettings renderSettings = appModel.getRenderSettingsManager().getForwardDefaultStyle(); + final RenderSettings renderSettings = appModel.getWindowManager().getRenderSettingsManager().getForwardDefaultStyle(); tracksOverlay.setRenderSettings( renderSettings ); final UpdateListener updateListener = () -> { viewer.repaint(); @@ -344,7 +344,6 @@ public MamutViewBdv( final MamutAppModel appModel, final Map< String, Object > g // Restore colorbar state. restoreColorbarState( colorBarOverlay, guiState ); viewer.getDisplay().overlays().add( colorBarOverlay ); - } protected OverlayGraphRenderer< OverlayVertexWrapper< Spot, Link >, OverlayEdgeWrapper< Spot, Link > > diff --git a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java index b67d87122..4bde57e28 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java +++ b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java @@ -144,7 +144,7 @@ public MamutViewGrapher( final MamutAppModel appModel, final Map< String, Object * Show the frame */ - final DataDisplayStyle forwardDefaultStyle = appModel.getDataDisplayStyleManager().getForwardDefaultStyle(); + final DataDisplayStyle forwardDefaultStyle = appModel.getWindowManager().getDataDisplayStyleManager().getForwardDefaultStyle(); coloringAdapter = new GraphColorGeneratorAdapter<>( viewGraph.getVertexMap(), viewGraph.getEdgeMap() ); final DataDisplayOptions options = DataDisplayOptions.options() .shareKeyPressedEvents( keyPressedManager ) diff --git a/src/main/java/org/mastodon/mamut/MamutViewTable.java b/src/main/java/org/mastodon/mamut/MamutViewTable.java index d486261b6..bf3e94445 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTable.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTable.java @@ -329,7 +329,7 @@ private static final ColoringModel registerBranchColoring( { final TagSetModel< Spot, Link > tagSetModel = appModel.getModel().getTagSetModel(); final FeatureModel featureModel = appModel.getModel().getFeatureModel(); - final FeatureColorModeManager featureColorModeManager = appModel.getFeatureColorModeManager(); + final FeatureColorModeManager featureColorModeManager = appModel.getWindowManager().getFeatureColorModeManager(); final ColoringModelBranchGraph< ?, ? > coloringModel = new ColoringModelBranchGraph<>( tagSetModel, featureColorModeManager, featureModel ); final ColoringMenu coloringMenu = new ColoringMenu( menuHandle.getMenu(), coloringModel ); diff --git a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java index 19c282b2a..127b99310 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java @@ -136,7 +136,7 @@ public MamutViewTrackScheme( final MamutAppModel appModel, final Map< String, Ob /* * show TrackSchemeFrame */ - final TrackSchemeStyle forwardDefaultStyle = appModel.getTrackSchemeStyleManager().getForwardDefaultStyle(); + final TrackSchemeStyle forwardDefaultStyle = appModel.getWindowManager().getTrackSchemeStyleManager().getForwardDefaultStyle(); coloringAdapter = new GraphColorGeneratorAdapter<>( viewGraph.getVertexMap(), viewGraph.getEdgeMap() ); final TrackSchemeOptions options = TrackSchemeOptions.options() .shareKeyPressedEvents( keyPressedManager ) diff --git a/src/main/java/org/mastodon/mamut/ProjectManager.java b/src/main/java/org/mastodon/mamut/ProjectManager.java deleted file mode 100644 index 5e5b39307..000000000 --- a/src/main/java/org/mastodon/mamut/ProjectManager.java +++ /dev/null @@ -1,1164 +0,0 @@ -/*- - * #%L - * Mastodon - * %% - * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ -package org.mastodon.mamut; - -import static org.mastodon.app.MastodonIcons.LOAD_ICON_MEDIUM; -import static org.mastodon.app.MastodonIcons.MAMUT_EXPORT_ICON_MEDIUM; -import static org.mastodon.app.MastodonIcons.MAMUT_IMPORT_ICON_MEDIUM; -import static org.mastodon.app.MastodonIcons.NEW_ICON_MEDIUM; -import static org.mastodon.app.MastodonIcons.SAVE_ICON_MEDIUM; -import static org.mastodon.mamut.io.project.MamutProjectIO.MAMUTPROJECT_VERSION_ATTRIBUTE_CURRENT; -import static org.mastodon.mamut.io.project.MamutProjectIO.MAMUTPROJECT_VERSION_ATTRIBUTE_NAME; - -import java.awt.Component; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowListener; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.reflect.InvocationTargetException; -import java.net.UnknownHostException; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; -import java.util.Arrays; -import java.util.concurrent.atomic.AtomicInteger; - -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPasswordField; -import javax.swing.JTextField; -import javax.swing.SwingUtilities; - -import org.embl.mobie.io.ome.zarr.openers.OMEZarrS3Opener; -import org.embl.mobie.io.util.S3Utils; -import org.jdom2.Document; -import org.jdom2.Element; -import org.jdom2.JDOMException; -import org.jdom2.input.SAXBuilder; -import org.jdom2.output.Format; -import org.jdom2.output.XMLOutputter; -import org.mastodon.app.MastodonIcons; -import org.mastodon.graph.io.RawGraphIO.FileIdToGraphMap; -import org.mastodon.graph.io.RawGraphIO.GraphToFileIdMap; -import org.mastodon.mamut.feature.MamutRawFeatureModelIO; -import org.mastodon.mamut.importer.simi.SimiImportDialog; -import org.mastodon.mamut.importer.tgmm.TgmmImportDialog; -import org.mastodon.mamut.importer.trackmate.MamutExporter; -import org.mastodon.mamut.importer.trackmate.TrackMateImporter; -import org.mastodon.mamut.io.project.MamutImagePlusProject; -import org.mastodon.mamut.io.project.MamutProject; -import org.mastodon.mamut.io.project.MamutProject.ProjectReader; -import org.mastodon.mamut.io.project.MamutProject.ProjectWriter; -import org.mastodon.mamut.io.project.MamutProjectIO; -import org.mastodon.mamut.model.Link; -import org.mastodon.mamut.model.Model; -import org.mastodon.mamut.model.Spot; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; -import org.mastodon.ui.keymap.KeyConfigContexts; -import org.mastodon.ui.util.ExtensionFileFilter; -import org.mastodon.ui.util.FileChooser; -import org.mastodon.ui.util.FileChooser.SelectionMode; -import org.mastodon.ui.util.XmlFileFilter; -import org.mastodon.util.BDVImagePlusExporter; -import org.mastodon.util.DummySpimData; -import org.mastodon.views.bdv.SharedBigDataViewerData; -import org.scijava.plugin.Plugin; -import org.scijava.ui.behaviour.KeyPressedManager; -import org.scijava.ui.behaviour.util.AbstractNamedAction; -import org.scijava.ui.behaviour.util.Actions; -import org.scijava.ui.behaviour.util.RunnableAction; - -import bdv.viewer.RequestRepaint; -import bdv.viewer.ViewerOptions; -import bdv.viewer.animate.MessageOverlayAnimator; -import ij.IJ; -import ij.ImagePlus; -import ij.gui.ImageWindow; -import mpicbg.spim.data.SpimData; -import mpicbg.spim.data.SpimDataException; -import mpicbg.spim.data.SpimDataIOException; -import mpicbg.spim.data.XmlIoSpimData; -import mpicbg.spim.data.XmlKeys; -import mpicbg.spim.data.generic.sequence.BasicViewSetup; - -public class ProjectManager -{ - public static final String CREATE_PROJECT = "create new project"; - - public static final String CREATE_PROJECT_FROM_URL = "create new project from url"; - - public static final String LOAD_PROJECT = "load project"; - - public static final String SAVE_PROJECT = "save project"; - - public static final String SAVE_PROJECT_AS = "save project as"; - - public static final String IMPORT_TGMM = "import tgmm"; - - public static final String IMPORT_SIMI = "import simi"; - - public static final String IMPORT_MAMUT = "import mamut"; - - public static final String EXPORT_MAMUT = "export mamut"; - - static final String[] CREATE_PROJECT_KEYS = new String[] { "not mapped" }; - - static final String[] CREATE_PROJECT_FROM_URL_KEYS = new String[] { "not mapped" }; - - static final String[] LOAD_PROJECT_KEYS = new String[] { "not mapped" }; - - static final String[] SAVE_PROJECT_KEYS = new String[] { "not mapped" }; - - static final String[] SAVE_PROJECT_AS_KEYS = new String[] { "not mapped" }; - - static final String[] IMPORT_TGMM_KEYS = new String[] { "not mapped" }; - - static final String[] IMPORT_SIMI_KEYS = new String[] { "not mapped" }; - - static final String[] IMPORT_MAMUT_KEYS = new String[] { "not mapped" }; - - static final String[] EXPORT_MAMUT_KEYS = new String[] { "not mapped" }; - - private static final String GUI_TAG = "MamutGui"; - - private static final String WINDOWS_TAG = "Windows"; - - /* - * Command descriptions for all provided commands - */ - @Plugin( type = CommandDescriptionProvider.class ) - public static class Descriptions extends CommandDescriptionProvider - { - public Descriptions() - { - super( KeyConfigContexts.MASTODON ); - } - - @Override - public void getCommandDescriptions( final CommandDescriptions descriptions ) - { - descriptions.add( CREATE_PROJECT, CREATE_PROJECT_KEYS, "Create a new project." ); - descriptions.add( CREATE_PROJECT_FROM_URL, CREATE_PROJECT_FROM_URL_KEYS, "Create a new project from URL." ); - descriptions.add( LOAD_PROJECT, LOAD_PROJECT_KEYS, "Load a project." ); - descriptions.add( SAVE_PROJECT, SAVE_PROJECT_KEYS, "Save the current project." ); - descriptions.add( SAVE_PROJECT_AS, SAVE_PROJECT_AS_KEYS, "Save the current project in a new file." ); - descriptions.add( IMPORT_TGMM, IMPORT_TGMM_KEYS, - "Import tracks from TGMM xml files into the current project." ); - descriptions.add( IMPORT_SIMI, IMPORT_SIMI_KEYS, - "Import tracks from a Simi Biocell .sbd into the current project." ); - descriptions.add( IMPORT_MAMUT, IMPORT_MAMUT_KEYS, "Import a MaMuT project." ); - descriptions.add( EXPORT_MAMUT, EXPORT_MAMUT_KEYS, "Export current project as a MaMuT project." ); - } - } - - private final TgmmImportDialog tgmmImportDialog; - - private final SimiImportDialog simiImportDialog; - - private MamutProject project; - - private File proposedProjectRoot; - - private final AbstractNamedAction createProjectAction; - - private final AbstractNamedAction createProjectFromUrlAction; - - private final AbstractNamedAction loadProjectAction; - - private final AbstractNamedAction saveProjectAction; - - private final AbstractNamedAction saveProjectAsAction; - - private final AbstractNamedAction importTgmmAction; - - private final AbstractNamedAction importSimiAction; - - private final AbstractNamedAction importMamutAction; - - private final AbstractNamedAction exportMamutAction; - - public ProjectManager() - { - tgmmImportDialog = new TgmmImportDialog( null ); - simiImportDialog = new SimiImportDialog( null ); - - createProjectAction = new RunnableAction( CREATE_PROJECT, this::createProject ); - createProjectFromUrlAction = new RunnableAction( CREATE_PROJECT_FROM_URL, this::createProjectFromUrl ); - loadProjectAction = new RunnableAction( LOAD_PROJECT, this::loadProject ); - saveProjectAction = new RunnableAction( SAVE_PROJECT, this::saveProject ); - saveProjectAsAction = new RunnableAction( SAVE_PROJECT_AS, this::saveProjectAs ); - importTgmmAction = new RunnableAction( IMPORT_TGMM, this::importTgmm ); - importSimiAction = new RunnableAction( IMPORT_SIMI, this::importSimi ); - importMamutAction = new RunnableAction( IMPORT_MAMUT, this::importMamut ); - exportMamutAction = new RunnableAction( EXPORT_MAMUT, this::exportMamut ); - - updateEnabledActions(); - } - - private void updateEnabledActions() - { - final boolean projectOpen = ( project != null ); - saveProjectAction.setEnabled( projectOpen ); - saveProjectAsAction.setEnabled( projectOpen ); - importTgmmAction.setEnabled( projectOpen ); - importSimiAction.setEnabled( projectOpen ); - exportMamutAction.setEnabled( projectOpen ); - } - - /** - * Add Project New/Load/Save actions and install them in the specified - * {@link Actions}. - * - * @param actions - * Actions are added here. - */ - public void install( final Actions actions ) - { - actions.namedAction( createProjectAction, CREATE_PROJECT_KEYS ); - actions.namedAction( createProjectFromUrlAction, CREATE_PROJECT_FROM_URL_KEYS ); - actions.namedAction( loadProjectAction, LOAD_PROJECT_KEYS ); - actions.namedAction( saveProjectAction, SAVE_PROJECT_KEYS ); - actions.namedAction( saveProjectAsAction, SAVE_PROJECT_AS_KEYS ); - actions.namedAction( importTgmmAction, IMPORT_TGMM_KEYS ); - actions.namedAction( importSimiAction, IMPORT_SIMI_KEYS ); - actions.namedAction( importMamutAction, IMPORT_MAMUT_KEYS ); - actions.namedAction( exportMamutAction, EXPORT_MAMUT_KEYS ); - } - - public synchronized void createProject() - { - final Component parent = null; // TODO - final File file = FileChooser.chooseFile( - parent, - null, - new XmlFileFilter(), - "Open BigDataViewer File", - FileChooser.DialogType.LOAD, - NEW_ICON_MEDIUM.getImage() ); - if ( file == null ) - return; - - try - { - open( MamutProjectIO.emptyProject( file ) ); - } - catch ( final IOException | SpimDataException e ) - { - e.printStackTrace(); - } - } - - public synchronized void createProjectFromUrl() - { - final Component parent = null; // TODO - final String urlString = JOptionPane.showInputDialog( parent, "Please input a url for image data" ); - if ( urlString == null ) - return; - - SpimData spimData = null; - try - { - spimData = OMEZarrS3Opener.readURL( urlString ); - } - catch ( final RuntimeException e ) - { - final JLabel lblUsername = new JLabel( "Username" ); - final JTextField textFieldUsername = new JTextField(); - final JLabel lblPassword = new JLabel( "Password" ); - final JPasswordField passwordField = new JPasswordField(); - final Object[] ob = { lblUsername, textFieldUsername, lblPassword, passwordField }; - final int result = - JOptionPane.showConfirmDialog( null, ob, "Please input credentials", JOptionPane.OK_CANCEL_OPTION ); - - if ( result == JOptionPane.OK_OPTION ) - { - final String username = textFieldUsername.getText(); - final char[] password = passwordField.getPassword(); - try - { - S3Utils.setS3AccessAndSecretKey( new String[] { username, new String( password ) } ); - } - finally - { - Arrays.fill( password, '0' ); - } - try - { - spimData = OMEZarrS3Opener.readURL( urlString ); - } - catch ( final Exception e1 ) - { - e1.printStackTrace(); - } - } - else - { - return; - } - } - catch ( final Exception e ) - { - e.printStackTrace(); - } - - final File file = FileChooser.chooseFile( - parent, - null, - new XmlFileFilter(), - "Save BigDataViewer File", - FileChooser.DialogType.SAVE, - NEW_ICON_MEDIUM.getImage() ); - if ( file == null ) - return; - - final XmlIoSpimData xmlIoSpimData = new XmlIoSpimData(); - spimData.setBasePath( file.getParentFile() ); - try - { - xmlIoSpimData.save( spimData, file.getAbsolutePath() ); - open( MamutProjectIO.emptyProject( file ) ); - } - catch ( final IOException | SpimDataException e ) - { - e.printStackTrace(); - } - } - - public synchronized void loadProject() - { - String fn = null; - if ( proposedProjectRoot != null ) - fn = proposedProjectRoot.getAbsolutePath(); - else if ( project != null && project.getProjectRoot() != null ) - fn = project.getProjectRoot().getAbsolutePath(); - final Component parent = null; // TODO - final File file = FileChooser.chooseFile( - true, - parent, - fn, - new ExtensionFileFilter( "mastodon" ), - "Open Mastodon Project", - FileChooser.DialogType.LOAD, - SelectionMode.FILES_AND_DIRECTORIES, - LOAD_ICON_MEDIUM.getImage() ); - if ( file == null ) - return; - - try - { - proposedProjectRoot = file; - final MamutProject project = MamutProjectIO.load( file.getAbsolutePath() ); - openWithDialog( project ); - } - catch ( final IOException | SpimDataException e ) - { - e.printStackTrace(); - } - } - - public synchronized void saveProjectAs() - { - if ( project == null ) - return; - - final String projectRoot = getProposedProjectRoot( project ); - - new Thread( new Runnable() - { - @Override - public void run() - { - try - { - - /* - * Check if the image data is based on a non-BDV image. If - * it's the case, offer to convert. - */ - - if ( project instanceof MamutImagePlusProject ) - { - - final AtomicInteger returnUserValue = new AtomicInteger( -1 ); - SwingUtilities.invokeAndWait( new Runnable() - { - - @Override - public void run() - { - final int val = JOptionPane.showConfirmDialog( - null, - "The image data is not currently saved as a BDV file, \n" - + "which is optimal for Mastodon. Mastodon might fail \n" - + "to load the image data when you will reopen the \n" - + "project you are about to save.\n" - + "\n" - + "Do you want to resave the image to the BDV file \n" - + "format prior to saving the Mastodon project? \n" - + "\n" - + "(Clicking 'Yes' will show the BDV exporter \n" - + "interface and close all Mastodon windows, \n" - + "then offer to save the Mastodon project.)", - "Image not in BDV file format", - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE, - MastodonIcons.MASTODON_ICON_MEDIUM ); - returnUserValue.set( val ); - } - } ); - - if ( returnUserValue.get() == JOptionPane.YES_OPTION ) - { - final MamutAppModel appModel = windowManager.getAppModel(); - - // Export imp to BDV. - final MamutImagePlusProject mipp = ( MamutImagePlusProject ) project; - final int n = projectRoot.indexOf( '.' ); - final String proposedXmlFile = projectRoot.subSequence( 0, n ).toString() + ".xml"; - final File bdvFile = BDVImagePlusExporter.export( mipp.getImagePlus(), proposedXmlFile ); - final MamutProject np = new MamutProject( new File( projectRoot ), bdvFile ); - np.setSpaceUnits( project.getSpaceUnits() ); - np.setTimeUnits( project.getTimeUnits() ); - project = np; - - // Export the settings file with what we can put in. - final Element root = new Element( "Settings" ); - final SharedBigDataViewerData sbdv = appModel.getSharedBdvData(); - root.addContent( sbdv.getManualTransformation().toXml() ); - root.addContent( sbdv.getSetupAssignments().toXml() ); - root.addContent( sbdv.getBookmarks().toXml() ); - final Document doc = new Document( root ); - final XMLOutputter xout = new XMLOutputter( Format.getPrettyFormat() ); - final String xmlFilename = bdvFile.getAbsolutePath(); - final String settings = xmlFilename.substring( 0, xmlFilename.length() - ".xml".length() ) - + ".settings" + ".xml"; - xout.output( doc, new FileWriter( settings ) ); - - // Reopen the image data from the new BDV file. - final SharedBigDataViewerData sharedBdvData = - openImageData( project, windowManager, false ); - - // Recreate app model. - final MamutAppModel nAppModel = new MamutAppModel( - appModel.getModel(), - sharedBdvData, - windowManager.getKeyPressedManager(), - windowManager.getTrackSchemeStyleManager(), - windowManager.getDataDisplayStyleManager(), - windowManager.getRenderSettingsManager(), - windowManager.getFeatureColorModeManager(), - windowManager.getFeatureProjectionsManager(), - windowManager.getKeymapManager(), - windowManager.getPlugins(), - windowManager.getGlobalAppActions() ); - windowManager.setAppModel( nAppModel ); - - // Remove listener to imp window closing. - final ImageWindow window = mipp.getImagePlus().getWindow(); - if ( window != null ) - { - for ( final WindowListener wl : window.getWindowListeners() ) - window.removeWindowListener( wl ); - - window.addWindowListener( new WindowAdapter() - { - @Override - public void windowClosing( final java.awt.event.WindowEvent e ) - { - mipp.getImagePlus().close(); - } - } ); - } - } - } - - /* - * Ask for a file path to save to. - */ - - final Component parent = null; // TODO - SwingUtilities.invokeAndWait( new Runnable() - { - @Override - public void run() - { - final File file = FileChooser.chooseFile( true, - parent, - projectRoot, - new ExtensionFileFilter( "mastodon" ), - "Save Mastodon Project", - FileChooser.DialogType.SAVE, - SelectionMode.FILES_ONLY, - SAVE_ICON_MEDIUM.getImage() ); - if ( file == null ) - return; - - proposedProjectRoot = file; - new Thread( () -> { - try - { - saveProject( proposedProjectRoot ); - } - catch ( final IOException e ) - { - e.printStackTrace(); - } - } ).start(); - } - } ); - } - catch ( final InterruptedException | InvocationTargetException | SpimDataException | IOException e ) - { - e.printStackTrace(); - } - } - } ).start(); - } - - public synchronized void saveProject() - { - if ( project == null ) - return; - - // If a Mastodon project was not yet created, ask to create one. - if ( project.getProjectRoot() == null ) - { - saveProjectAs(); - return; - } - - try - { - saveProject( project.getProjectRoot() ); - } - catch ( final IOException e ) - { - e.printStackTrace(); - } - } - - public synchronized void saveProject( final File projectRoot ) throws IOException - { - if ( project == null ) - return; - - final File tmpDatasetXml = originalOrBackupDatasetXml( project ); - - // update project root - project.setProjectRoot( projectRoot ); - try (final MamutProject.ProjectWriter writer = project.openForWriting()) - { - new MamutProjectIO().save( project, writer ); - final Model model = windowManager.getAppModel().getModel(); - final GraphToFileIdMap< Spot, Link > idmap = model.saveRaw( writer ); - // Serialize feature model. - MamutRawFeatureModelIO.serialize( windowManager.getContext(), model, idmap, writer ); - // Serialize GUI state. - saveGUI( writer ); - // Save a copy of the Spim Data Xml File - saveBackupDatasetXml( tmpDatasetXml, writer ); - // Set save point. - model.setSavePoint(); - } - updateEnabledActions(); - } - - /** - * Opens a project. If {@code project.getProjectRoot() == null} this is a - * new project and data structures are initialized as empty. The image data - * {@code project.getDatasetXmlFile()} must always be set. The GUI state is - * not restored, even if one is found in the project file. - * - * @param project - * the project to open. - * @throws IOException - * if an IO exception occurs during opening. - * @throws SpimDataException - * if a spim-data exception occurs while opening the spim-data - * XML file. - */ - public synchronized void open( final MamutProject project ) throws IOException, SpimDataException - { - open( project, false, false ); - } - - /** - * Opens a project. GUI state is restored. And if the image data cannot - * be loaded a dialog shows up telling the user about the problem, and - * offering to start Mastodon on dummy image data. - */ - public synchronized void openWithDialog( final MamutProject project ) throws IOException, SpimDataException - { - try - { - open( project, true, false ); - } - catch ( final SpimDataIOException | RuntimeException e ) - { - if ( getUserPermissionToOpenDummyData( project, e ) ) - { - open( project, true, true ); - return; - } - - throw e; - } - } - - /** - * Opens a project. If {@code project.getProjectRoot() == null} this is a - * new project and data structures are initialized as empty. The image data - * {@code project.getDatasetXmlFile()} must always be set. - * - * @param project - * the project to open. - * @param restoreGUIState - * if true, the GUI state settings will be read from - * the project file, and if found, the saved GUI state will be - * restored. - * @param loadDummyData - * Load dummy image data (black images), this also works if the - * dataset XML is missing. - * @throws IOException - * if an IO exception occurs during opening. - * @throws SpimDataException - * if a spim-data exception occurs while opening the spim-data - * XML file. - */ - public synchronized void open( - final MamutProject project, - final boolean restoreGUIState, - final boolean loadDummyData ) throws IOException, SpimDataException - { - final MamutProject localProject; - - // Check whether the project points to a BDV file. - final String canonicalPath = project.getDatasetXmlFile().getAbsolutePath(); - if ( !canonicalPath.endsWith( ".xml" ) && !canonicalPath.endsWith( DummySpimData.DUMMY ) ) - { - final ImagePlus imp; - - // Do we have the ImagePlus already in memory? - if ( project instanceof MamutImagePlusProject ) - { - imp = ( ( MamutImagePlusProject ) project ).getImagePlus(); - // No need to morph. - localProject = project; - } - else - { - // Assume the path points to a plain image file. - imp = IJ.openImage( canonicalPath ); - // If it does not work tell the user. - if ( imp == null ) - throw new IOException( "Cannot open image " + canonicalPath ); - - // Morph the project. - localProject = new MamutImagePlusProject( imp ); - localProject.setProjectRoot( project.getProjectRoot() ); - localProject.setSpaceUnits( project.getSpaceUnits() ); - localProject.setTimeUnits( project.getTimeUnits() ); - } - } - else - { - // Opening a project with standard BDV (or DUMMY) image data - localProject = project; - } - - // Prepare image data. - final SharedBigDataViewerData sharedBdvData = openImageData( localProject, windowManager, loadDummyData ); - - this.project = localProject; - - // Load model. - loadModel( windowManager, sharedBdvData, localProject, restoreGUIState ); - - updateEnabledActions(); - } - - private static void loadModel( final WindowManager windowManager, final SharedBigDataViewerData sharedBdvData, - final MamutProject project, final boolean restoreGUIState ) throws IOException - { - /* - * Try to read units from spimData is they are not present - */ - if ( project.getSpaceUnits() == null ) - { - project.setSpaceUnits( - sharedBdvData.getSpimData().getSequenceDescription().getViewSetupsOrdered().stream() - .filter( BasicViewSetup::hasVoxelSize ) - .map( setup -> setup.getVoxelSize().unit() ) - .findFirst() - .orElse( "pixel" ) ); - } - - if ( project.getTimeUnits() == null ) - { - project.setTimeUnits( "frame" ); - } - - /* - * Load Model - */ - final Model model = new Model( project.getSpaceUnits(), project.getTimeUnits() ); - final boolean isNewProject = project.getProjectRoot() == null; - if ( !isNewProject ) - { - try (final MamutProject.ProjectReader reader = project.openForReading()) - { - final FileIdToGraphMap< Spot, Link > idmap = model.loadRaw( reader ); - // Load features. - MamutRawFeatureModelIO.deserialize( - windowManager.getContext(), - model, - idmap, - reader ); - } - catch ( final ClassNotFoundException e ) - { - e.printStackTrace(); - } - } - - model.setSavePoint(); - model.declareDefaultFeatures(); - - final MamutAppModel appModel = new MamutAppModel( - model, - sharedBdvData, - windowManager.getKeyPressedManager(), - windowManager.getTrackSchemeStyleManager(), - windowManager.getDataDisplayStyleManager(), - windowManager.getRenderSettingsManager(), - windowManager.getFeatureColorModeManager(), - windowManager.getFeatureProjectionsManager(), - windowManager.getKeymapManager(), - windowManager.getPlugins(), - windowManager.getGlobalAppActions() ); - - windowManager.setAppModel( appModel ); - - // Restore GUI state if loaded project, now that we have an App model. - if ( !isNewProject && restoreGUIState ) - { - try (final MamutProject.ProjectReader reader = project.openForReading()) - { - try - { - loadGUI( reader, windowManager ); - } - catch ( final FileNotFoundException fnfe ) - { - // Ignore missing gui file. - } - } - } - } - - public synchronized void importTgmm() - { - if ( project == null ) - return; - - final MamutAppModel appModel = windowManager.getAppModel(); - tgmmImportDialog.showImportDialog( appModel.getSharedBdvData().getSpimData(), appModel.getModel() ); - - updateEnabledActions(); - } - - public synchronized void importSimi() - { - if ( project == null ) - return; - - final MamutAppModel appModel = windowManager.getAppModel(); - simiImportDialog.showImportDialog( appModel.getSharedBdvData().getSpimData(), appModel.getModel() ); - - updateEnabledActions(); - } - - public synchronized void importMamut() - { - final Component parent = null; // TODO - final File file = FileChooser.chooseFile( - parent, - null, - new XmlFileFilter(), - "Import MaMuT Project", - FileChooser.DialogType.LOAD, - MAMUT_IMPORT_ICON_MEDIUM.getImage() ); - if ( file == null ) - return; - - try - { - final TrackMateImporter importer = new TrackMateImporter( file ); - open( importer.createProject() ); - importer.readModel( windowManager.getAppModel().getModel(), windowManager.getFeatureSpecsService() ); - } - catch ( final IOException | SpimDataException e ) - { - e.printStackTrace(); - } - - updateEnabledActions(); - } - - public synchronized void exportMamut() - { - if ( project == null ) - return; - - final String filename = getProprosedMamutExportFileName( project ); - - final Component parent = null; // TODO - final File file = FileChooser.chooseFile( - parent, - filename, - new XmlFileFilter(), - "Export As MaMuT Project", - FileChooser.DialogType.SAVE, - MAMUT_EXPORT_ICON_MEDIUM.getImage() ); - if ( file == null ) - return; - - try - { - MamutExporter.export( file, windowManager.getAppModel().getModel(), project ); - } - catch ( final IOException e ) - { - e.printStackTrace(); - } - } - - private static final String EXT_DOT_MASTODON = ".mastodon"; - - private static String stripExtensionIfPresent( final String fn, final String ext ) - { - return fn.endsWith( ext ) - ? fn.substring( 0, fn.length() - ext.length() ) - : fn; - } - - private static String getProprosedMamutExportFileName( final MamutProject project ) - { - final File pf = project.getProjectRoot(); - if ( pf != null ) - { - final String fn = stripExtensionIfPresent( pf.getName(), EXT_DOT_MASTODON ); - return new File( pf.getParentFile(), fn + "_mamut.xml" ).getAbsolutePath(); - } - else - { - final File f = project.getDatasetXmlFile(); - final String fn = stripExtensionIfPresent( f.getName(), ".xml" ); - return new File( f.getParentFile(), fn + "_mamut.xml" ).getAbsolutePath(); - } - } - - private static String getProposedProjectRoot( final MamutProject project ) - { - if ( project.getProjectRoot() != null ) - return project.getProjectRoot().getAbsolutePath(); - else - { - final File f = project.getDatasetXmlFile(); - final String fn = stripExtensionIfPresent( f.getName(), ".xml" ); - return new File( f.getParentFile(), fn + EXT_DOT_MASTODON ).getAbsolutePath(); - } - } - - /* - * GUI IO methods. - */ - - /** - * Serialize window positions and states. - * - * @throws IOException - * @throws FileNotFoundException - */ - private void saveGUI( final ProjectWriter writer ) throws FileNotFoundException, IOException - { - final Element guiRoot = new Element( GUI_TAG ); - guiRoot.setAttribute( MAMUTPROJECT_VERSION_ATTRIBUTE_NAME, MAMUTPROJECT_VERSION_ATTRIBUTE_CURRENT ); - final Element windows = new Element( WINDOWS_TAG ); - windowManager.forEachView( ( view ) -> windows.addContent( - MamutViewStateSerialization.toXml( view ) ) ); - windowManager.forEachBranchView( ( view ) -> windows.addContent( - MamutViewStateSerialization.toXml( view ) ) ); - guiRoot.addContent( windows ); - final Document doc = new Document( guiRoot ); - final XMLOutputter xout = new XMLOutputter( Format.getPrettyFormat() ); - try (OutputStream outputStream = writer.getGuiOutputStream()) - { - xout.output( doc, outputStream ); - } - } - - private static void loadGUI( final ProjectReader reader, final WindowManager windowManager ) throws IOException - { - final SAXBuilder sax = new SAXBuilder(); - Document guiDoc; - try (InputStream inputStream = reader.getGuiInputStream()) - { - guiDoc = sax.build( inputStream ); - } - catch ( final JDOMException e ) - { - throw new IOException( e ); - } - final Element root = guiDoc.getRootElement(); - if ( !GUI_TAG.equals( root.getName() ) ) - throw new IOException( "expected <" + GUI_TAG + "> root element. wrong file?" ); - - final Element windowsEl = root.getChild( WINDOWS_TAG ); - if ( null == windowsEl ) - return; - - MamutViewStateSerialization.fromXml( windowsEl, windowManager ); - } - - /** - * Opens and prepares the shared image data, based on whether the Mamut - * project points to a BDV XML/H5 pair or an opened ImagePlus. - * - * @param project - * the project. - * @param windowManager - * the {@link WindowManager} instance, used to create a lambda - * that refreshes all BDV views and get the session - * {@link KeyPressedManager}. - * @param dummyData - * if {@code true}: in case image data was not found during - * opening, the user will be provided with work around options - * (e.g. loading dummy image data, fixing the project manually) - * @return a new {@link SharedBigDataViewerData} instance or {@code null}, - * if image data (BDV) was not found and the user decided to not - * open dummy image data instead - */ - private static final SharedBigDataViewerData openImageData( - final MamutProject project, - final WindowManager windowManager, - final boolean dummyData ) throws SpimDataException, IOException - { - // Prepare base view options. - final ViewerOptions options = ViewerOptions.options() - .shareKeyPressedEvents( windowManager.getKeyPressedManager() ) - .msgOverlay( new MessageOverlayAnimator( 1500, 0.005, 0.02 ) ); - - final RequestRepaint requestRepaint = () -> windowManager.forEachBdvView( MamutViewBdv::requestRepaint ); - - // Is it based on ImagePlus? - if ( project instanceof MamutImagePlusProject ) - { - final MamutImagePlusProject mipp = ( MamutImagePlusProject ) project; - return SharedBigDataViewerData.fromImagePlus( mipp.getImagePlus(), options, requestRepaint ); - } - - // Open dummy data string? - final String spimDataXmlFilename = project.getDatasetXmlFile().getPath(); - if ( DummySpimData.isDummyString( spimDataXmlFilename ) ) - return SharedBigDataViewerData.fromDummyFilename( spimDataXmlFilename, options, requestRepaint ); - - // Open dummy data flag? - if ( dummyData ) - return openDummyImageData( project, options, requestRepaint ); - - return SharedBigDataViewerData.fromSpimDataXmlFile( project.getDatasetXmlFile().getAbsolutePath(), - options, - requestRepaint ); - } - - private static SharedBigDataViewerData openDummyImageData( final MamutProject project, final ViewerOptions options, - final RequestRepaint requestRepaint ) - { - try - { - final String backupDatasetXml = originalOrBackupDatasetXml( project ).getAbsolutePath(); - return SharedBigDataViewerData.createDummyDataFromSpimDataXml( backupDatasetXml, options, requestRepaint ); - } - catch ( final Throwable e ) - { - return simpleDummyData( project, options, requestRepaint ); - } - } - - private static SharedBigDataViewerData simpleDummyData( final MamutProject project, final ViewerOptions options, - final RequestRepaint requestRepaint ) - { - try (final MamutProject.ProjectReader reader = project.openForReading()) - { - final Model model = new Model( "pixel", "frame" ); - model.loadRaw( reader ); - final String requiredImageSizeAsString = requiredImageSizeAsString( model ); - return SharedBigDataViewerData.fromDummyFilename( requiredImageSizeAsString, options, requestRepaint ); - } - catch ( final IOException e ) - { - throw new RuntimeException( e ); - } - } - - private static String requiredImageSizeAsString( final Model model ) - { - int time = 0; - double x = 0; - double y = 0; - double z = 0; - for ( final Spot spot : model.getGraph().vertices() ) - { - time = Math.max( time, spot.getTimepoint() ); - final double radius = Math.sqrt( spot.getBoundingSphereRadiusSquared() ); - x = Math.max( x, spot.getDoublePosition( 0 ) + radius ); - y = Math.max( y, spot.getDoublePosition( 1 ) + radius ); - z = Math.max( z, spot.getDoublePosition( 2 ) + radius ); - } - return String.format( "x=%s y=%s z=%s t=%s.dummy", - roundUp( x ) + 1, - roundUp( y ) + 1, - roundUp( z ) + 1, - time + 1 ); - } - - private static long roundUp( final double x ) - { - return ( long ) Math.ceil( x ); - } - - private static File originalOrBackupDatasetXml( final MamutProject project ) - { - try - { - final File datasetXml = project.getDatasetXmlFile(); - if ( datasetXml.exists() ) - return datasetXml; - else - return copyBackupDatasetXmlToTmpFile( project ); - } - catch ( final IOException e ) - { - return null; - } - } - - private static File copyBackupDatasetXmlToTmpFile( final MamutProject project ) throws IOException - { - try (final MamutProject.ProjectReader reader = project.openForReading(); - final InputStream is = reader.getBackupDatasetXmlInputStream()) - { - final File tmp = File.createTempFile( "mastodon-dataset-xml-backup", ".xml" ); - tmp.deleteOnExit(); - Files.copy( is, tmp.toPath(), StandardCopyOption.REPLACE_EXISTING ); - return tmp; - } - } - - /** - * Saves a copy of the dataset.xml (if there is any) to the projection location. - */ - private void saveBackupDatasetXml( final File tmpDatasetXml, final ProjectWriter projectWriter ) - { - if ( tmpDatasetXml == null ) - return; - - try (OutputStream out = projectWriter.getBackupDatasetXmlOutputStream()) - { - Files.copy( tmpDatasetXml.toPath(), out ); - } - catch ( final IOException e ) - { - System.err.println( "Could not create backup of the dataset.xml file. Reason: '" + e.getMessage() + "'." ); - } - } - - /** - * Show an dialog the explains to the user why the image data could not been - * loaded, and offers to open Mastodon with dummy image data. - */ - private static boolean getUserPermissionToOpenDummyData( final MamutProject project, final Exception e ) - { - final String problemDescription = getProblemDescription( project, e ); - System.err.println( problemDescription ); - final String title = "Problem Opening Mastodon Project"; - String message = ""; - message += "Mastodon could not find the images associated with this project.\n"; - message += "\n"; - message += problemDescription + "\n"; - message += "\n"; - message += "It is still possible to open the project.\n"; - message += "You can inspect and modify the tracking data.\n"; - message += "But you won't be able to see the image data.\n"; - message += "\n"; - message += "You may fix this problem by correcting the image path in the Mastodon project.\n"; - message += "In the Mastodon menu select: File -> Fix Image Path.\n"; - message += "\n"; - message += "How would you like to continue?"; - final String[] options = { "Open With Dummy Images", "Cancel" }; - final int dialogResult = JOptionPane.showOptionDialog( null, message, title, JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE, null, options, null ); - return dialogResult == JOptionPane.YES_OPTION; - } - - private static String getProblemDescription( final MamutProject project, final Exception e ) - { - final File datasetXml = project.getDatasetXmlFile(); - if ( !datasetXml.exists() ) - return "The image data XML was not found:\n" + datasetXml; - final Throwable cause = e.getCause(); - if ( cause instanceof UnknownHostException ) - return errorMessageUnknownHost( datasetXml, cause.getMessage() ); - return e.getMessage(); - } - - private static String errorMessageUnknownHost( final File datasetXml, final String host ) - { - final SAXBuilder sax = new SAXBuilder(); - try - { - final Document doc = sax.build( datasetXml ); - final Element root = doc.getRootElement(); - final String baseUrl = root - .getChild( XmlKeys.SEQUENCEDESCRIPTION_TAG ) - .getChild( XmlKeys.IMGLOADER_TAG ) - .getChildText( "baseUrl" ); - return "Cannot reach host " + host + " for the dataset URL: " + baseUrl; - } - catch ( final Exception e ) - { - return "Unparsable dataset file: " + e.getMessage(); - } - } -} diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 41cd6419b..fac7330a7 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -194,8 +194,6 @@ public class WindowManager private final JDialog featureComputationDialog; - final ProjectManager projectManager; - private final Listeners.List< BdvViewCreatedListener > bdvViewCreatedListeners; private final PreferencesDialog settings; @@ -231,9 +229,6 @@ public WindowManager( final MamutAppModel appModel ) final Actions globalAppActions = appModel.getAppActions(); - this.projectManager = new ProjectManager(); - projectManager.install( globalAppActions ); - this.newBdvViewAction = new RunnableActionPair( NEW_BDV_VIEW, this::createBigDataViewer, this::createBranchBigDataViewer ); this.newTrackSchemeViewAction = new RunnableActionPair( NEW_TRACKSCHEME_VIEW, this::createTrackScheme, this::createBranchTrackScheme ); this.newTableViewAction = new RunnableAction( NEW_TABLE_VIEW, () -> createTable( false ) ); @@ -894,17 +889,6 @@ public List< MamutViewBdv > getBdvWindows() return bdvWindows; } - /** - * Exposes the {@link ProjectManager} of this window manager, that handles - * project files. - * - * @return the project manager. - */ - public ProjectManager getProjectManager() - { - return projectManager; - } - private CommandDescriptions buildCommandDescriptions() { final CommandDescriptionsBuilder builder = new CommandDescriptionsBuilder(); diff --git a/src/main/java/org/mastodon/mamut/io/MamutIO.java b/src/main/java/org/mastodon/mamut/io/MamutIO.java deleted file mode 100644 index 6cc9623d1..000000000 --- a/src/main/java/org/mastodon/mamut/io/MamutIO.java +++ /dev/null @@ -1,197 +0,0 @@ -package org.mastodon.mamut.io; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; - -import org.jdom2.Document; -import org.jdom2.Element; -import org.jdom2.JDOMException; -import org.jdom2.input.SAXBuilder; -import org.mastodon.graph.io.RawGraphIO.FileIdToGraphMap; -import org.mastodon.mamut.MamutAppModel; -import org.mastodon.mamut.WindowManager; -import org.mastodon.mamut.feature.MamutRawFeatureModelIO; -import org.mastodon.mamut.io.project.MamutImagePlusProject; -import org.mastodon.mamut.io.project.MamutProject; -import org.mastodon.mamut.model.Link; -import org.mastodon.mamut.model.Model; -import org.mastodon.mamut.model.Spot; -import org.mastodon.ui.keymap.KeymapManager; -import org.mastodon.util.DummySpimData; -import org.mastodon.views.bdv.SharedBigDataViewerData; -import org.scijava.Context; -import org.scijava.ui.behaviour.KeyPressedManager; - -import ij.IJ; -import ij.ImagePlus; - -public class MamutIO -{ - - private static final String GUI_TAG = "MamutGui"; - private static final String WINDOWS_TAG = "Windows"; - - public static MamutAppModel open( final MamutProject project, final Context context ) throws IOException - { - return open( project, context, false ); - } - - public static MamutAppModel open( final MamutProject project, final Context context, final boolean restoreGUIState ) throws IOException - { - final Model model = loadModel( project, context ); - final SharedBigDataViewerData imageData = loadImageData( project ); - final KeyPressedManager keyPressedManager = new KeyPressedManager(); - final KeymapManager keymapManager = new KeymapManager(); - final MamutAppModel appModel = new MamutAppModel( context, model, imageData, keyPressedManager, keymapManager ); - - if ( restoreGUIState ) - loadGUI( project, appModel.getWindowManager() ); - - return appModel; - } - - public static SharedBigDataViewerData loadImageData( final MamutProject project ) - { - // Check whether the project points to a BDV file. - final String canonicalPath = project.getDatasetXmlFile().getAbsolutePath(); - if ( !canonicalPath.endsWith( ".xml" ) && !canonicalPath.endsWith( DummySpimData.DUMMY ) ) - { - final ImagePlus imp; - - // Do we have the ImagePlus already in memory? - if ( project instanceof MamutImagePlusProject ) - { - imp = ( ( MamutImagePlusProject ) project ).getImagePlus(); - } - else - { - // Assume the path points to a plain image file. - imp = IJ.openImage( canonicalPath ); - // If it does not work tell the user. - if ( imp == null ) - throw new IOException( "Cannot open image " + canonicalPath ); - } - } - else - { - // Opening a project with standard BDV (or DUMMY) image data - } - - /* - * Move this to AppModel - */ - -// // Prepare image data. -// // Prepare base view options. -// final ViewerOptions options = ViewerOptions.options() -// .shareKeyPressedEvents( windowManager.getKeyPressedManager() ) -// .msgOverlay( new MessageOverlayAnimator( 1500, 0.005, 0.02 ) ); -// -// final RequestRepaint requestRepaint = () -> windowManager.forEachBdvView( MamutViewBdv::requestRepaint ); - - // Is it based on ImagePlus? - if ( project instanceof MamutImagePlusProject ) - { - final MamutImagePlusProject mipp = ( MamutImagePlusProject ) project; - return SharedBigDataViewerData.fromImagePlus( mipp.getImagePlus(), options, requestRepaint ); - } - - // Open dummy data string? - final String spimDataXmlFilename = project.getDatasetXmlFile().getPath(); - if ( DummySpimData.isDummyString( spimDataXmlFilename ) ) - return SharedBigDataViewerData.fromDummyFilename( spimDataXmlFilename, options, requestRepaint ); - - // Open dummy data flag? - if ( dummyData ) - return openDummyImageData( project, options, requestRepaint ); - - return SharedBigDataViewerData.fromSpimDataXmlFile( project.getDatasetXmlFile().getAbsolutePath(), - options, - requestRepaint ); - } - - /** - * Loads a {@link Model} from a project file. - * - * @param project - * the project to load from. - * @param context - * the current context, used to get feature serializers. - * @return a new model. - * @throws IOException - * if there is a problem reading the project. - */ - public static final Model loadModel( final MamutProject project, final Context context ) throws IOException - { - final Model model = new Model( project.getSpaceUnits(), project.getTimeUnits() ); - final boolean isNewProject = project.getProjectRoot() == null; - if ( !isNewProject ) - { - try (final MamutProject.ProjectReader reader = project.openForReading()) - { - final FileIdToGraphMap< Spot, Link > idmap = model.loadRaw( reader ); - // Load features. - MamutRawFeatureModelIO.deserialize( - context, - model, - idmap, - reader ); - } - catch ( final ClassNotFoundException e ) - { - e.printStackTrace(); - } - } - - model.setSavePoint(); - model.declareDefaultFeatures(); - return model; - } - - /** - * Recreates the GUI configuration saved in the specified project. When - * calling this method, windows are created and shown on the display. - * - * @param project - * the project to read from. - * @param windowManager - * a window manager instance, used to create windows. - * @throws IOException - * if there is a problem reading the project. - */ - public static final void loadGUI( final MamutProject project, final WindowManager windowManager ) throws IOException - { - try (final MamutProject.ProjectReader reader = project.openForReading()) - { - try - { - - final SAXBuilder sax = new SAXBuilder(); - Document guiDoc; - try (InputStream inputStream = reader.getGuiInputStream()) - { - guiDoc = sax.build( inputStream ); - } - catch ( final JDOMException e ) - { - throw new IOException( e ); - } - final Element root = guiDoc.getRootElement(); - if ( !GUI_TAG.equals( root.getName() ) ) - throw new IOException( "expected <" + GUI_TAG + "> root element. wrong file?" ); - - final Element windowsEl = root.getChild( WINDOWS_TAG ); - if ( null == windowsEl ) - return; - - MamutViewStateSerialization.fromXml( windowsEl, windowManager ); - } - catch ( final FileNotFoundException fnfe ) - { - // Ignore missing gui file. - } - } - } - -} diff --git a/src/main/java/org/mastodon/mamut/io/ProjectActions.java b/src/main/java/org/mastodon/mamut/io/ProjectActions.java new file mode 100644 index 000000000..67c7c70d0 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/io/ProjectActions.java @@ -0,0 +1,101 @@ +package org.mastodon.mamut.io; + +import java.awt.Component; +import java.awt.Frame; + +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.ui.keymap.CommandDescriptionProvider; +import org.mastodon.ui.keymap.CommandDescriptions; +import org.mastodon.ui.keymap.KeyConfigContexts; +import org.scijava.Context; +import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.util.Actions; +import org.scijava.ui.behaviour.util.RunnableAction; + +/** + * Collect actions, descriptions and keys related to project loading, saving, + * importing and exporting actions. + */ +public class ProjectActions +{ + public static final String CREATE_PROJECT = "create new project"; + public static final String CREATE_PROJECT_FROM_URL = "create new project from url"; + public static final String LOAD_PROJECT = "load project"; + public static final String SAVE_PROJECT = "save project"; + public static final String SAVE_PROJECT_AS = "save project as"; + public static final String IMPORT_TGMM = "import tgmm"; + public static final String IMPORT_SIMI = "import simi"; + public static final String IMPORT_MAMUT = "import mamut"; + public static final String EXPORT_MAMUT = "export mamut"; + + static final String[] CREATE_PROJECT_KEYS = new String[] { "not mapped" }; + static final String[] CREATE_PROJECT_FROM_URL_KEYS = new String[] { "not mapped" }; + static final String[] LOAD_PROJECT_KEYS = new String[] { "not mapped" }; + static final String[] SAVE_PROJECT_KEYS = new String[] { "not mapped" }; + static final String[] SAVE_PROJECT_AS_KEYS = new String[] { "not mapped" }; + static final String[] IMPORT_TGMM_KEYS = new String[] { "not mapped" }; + static final String[] IMPORT_SIMI_KEYS = new String[] { "not mapped" }; + static final String[] IMPORT_MAMUT_KEYS = new String[] { "not mapped" }; + static final String[] EXPORT_MAMUT_KEYS = new String[] { "not mapped" }; + + /** + * Install the global actions for creating, loading or importing a new + * project. These actions relates to the app context where an app model does + * not exist yet (they create it). + */ + public static void installGlobalActions( final Actions actions, final Context context, final Component parentComponent ) + { + final RunnableAction createProjectAction = new RunnableAction( CREATE_PROJECT, () -> ProjectCreator.createProjectWithDialog( context, parentComponent ) ); + final RunnableAction createProjectFromUrlAction = new RunnableAction( CREATE_PROJECT_FROM_URL, () -> ProjectCreator.createProjectFromUrl( context, parentComponent ) ); + final RunnableAction loadProjectAction = new RunnableAction( LOAD_PROJECT, () -> ProjectLoader.openWithDialog( context, parentComponent ) ); + final RunnableAction importMamutAction = new RunnableAction( IMPORT_MAMUT, () -> ProjectImporter.openMamutWithDialog( parentComponent, context ) ); + + actions.namedAction( createProjectAction, CREATE_PROJECT_KEYS ); + actions.namedAction( createProjectFromUrlAction, CREATE_PROJECT_FROM_URL_KEYS ); + actions.namedAction( loadProjectAction, LOAD_PROJECT_KEYS ); + actions.namedAction( importMamutAction, IMPORT_MAMUT_KEYS ); + } + + public static void installAppActions( final Actions actions, final MamutAppModel appModel, final Frame parentComponent ) + { + final RunnableAction saveProjectAction = new RunnableAction( SAVE_PROJECT, () -> ProjectSaver.saveProject( appModel, parentComponent ) ); + final RunnableAction saveProjectAsAction = new RunnableAction( SAVE_PROJECT_AS, () -> ProjectSaver.saveProjectAs( appModel, parentComponent ) ); + final RunnableAction importTgmmAction = new RunnableAction( IMPORT_TGMM, () -> ProjectImporter.importTgmmDataWithDialog( appModel, parentComponent ) ); + final RunnableAction importSimiAction = new RunnableAction( IMPORT_TGMM, () -> ProjectImporter.importSimiDataWithDialog( appModel, parentComponent ) ); + final RunnableAction exportMamutAction = new RunnableAction( EXPORT_MAMUT, () -> ProjectExporter.exportMamut( appModel, parentComponent ) ); + + actions.namedAction( saveProjectAction, SAVE_PROJECT_KEYS ); + actions.namedAction( saveProjectAsAction, SAVE_PROJECT_AS_KEYS ); + actions.namedAction( importTgmmAction, IMPORT_TGMM_KEYS ); + actions.namedAction( importSimiAction, IMPORT_SIMI_KEYS ); + actions.namedAction( exportMamutAction, EXPORT_MAMUT_KEYS ); + } + + /* + * Command descriptions for all provided commands + */ + @Plugin( type = CommandDescriptionProvider.class ) + public static class Descriptions extends CommandDescriptionProvider + { + public Descriptions() + { + super( KeyConfigContexts.MASTODON ); + } + + @Override + public void getCommandDescriptions( final CommandDescriptions descriptions ) + { + descriptions.add( CREATE_PROJECT, CREATE_PROJECT_KEYS, "Create a new project." ); + descriptions.add( CREATE_PROJECT_FROM_URL, CREATE_PROJECT_FROM_URL_KEYS, "Create a new project from URL." ); + descriptions.add( LOAD_PROJECT, LOAD_PROJECT_KEYS, "Load a project." ); + descriptions.add( SAVE_PROJECT, SAVE_PROJECT_KEYS, "Save the current project." ); + descriptions.add( SAVE_PROJECT_AS, SAVE_PROJECT_AS_KEYS, "Save the current project in a new file." ); + descriptions.add( IMPORT_TGMM, IMPORT_TGMM_KEYS, + "Import tracks from TGMM xml files into the current project." ); + descriptions.add( IMPORT_SIMI, IMPORT_SIMI_KEYS, + "Import tracks from a Simi Biocell .sbd into the current project." ); + descriptions.add( IMPORT_MAMUT, IMPORT_MAMUT_KEYS, "Import a MaMuT project." ); + descriptions.add( EXPORT_MAMUT, EXPORT_MAMUT_KEYS, "Export current project as a MaMuT project." ); + } + } +} diff --git a/src/main/java/org/mastodon/mamut/io/ProjectCreator.java b/src/main/java/org/mastodon/mamut/io/ProjectCreator.java new file mode 100644 index 000000000..223278295 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/io/ProjectCreator.java @@ -0,0 +1,202 @@ +package org.mastodon.mamut.io; + +import static org.mastodon.app.MastodonIcons.NEW_ICON_MEDIUM; + +import java.awt.Component; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; + +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPasswordField; +import javax.swing.JTextField; + +import org.embl.mobie.io.ome.zarr.openers.OMEZarrS3Opener; +import org.embl.mobie.io.util.S3Utils; +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; +import org.mastodon.ui.util.FileChooser; +import org.mastodon.ui.util.XmlFileFilter; +import org.scijava.Context; + +import mpicbg.spim.data.SpimData; +import mpicbg.spim.data.SpimDataException; +import mpicbg.spim.data.XmlIoSpimData; + +/** + * Static methods to create new Mastodon Mamut projects from images. + */ +public class ProjectCreator +{ + + /** + * Interactively creates a new project prompting the user for a path to a + * BDV/XML file. + *

+ * A dialog is shown to prompt the user for the path to the XML file. If the + * image data cannot be loaded a dialog shows up telling the user about the + * problem, and offering to start Mastodon on substituted dummy image data. + * + * @param context + * the current context. + * @param parentComponent + * a component to use as parent to show dialogs during opening. + * Can be null. + * @return a new {@link MamutAppModel} or null if the user + * clicked cancel, or if the BDV file is faulty and the user + * declined to substitute a dummy dataset. + */ + public static synchronized MamutAppModel createProjectWithDialog( final Context context, final Component parentComponent ) + { + final File file = FileChooser.chooseFile( + parentComponent, + null, + new XmlFileFilter(), + "Open BigDataViewer File", + FileChooser.DialogType.LOAD, + NEW_ICON_MEDIUM.getImage() ); + if ( file == null ) + return null; + + try + { + return createProjectFromBdvFile( file, context, parentComponent ); + } + catch ( final SpimDataException e ) + { + JOptionPane.showMessageDialog( + parentComponent, + "Problem reading image file:\n" + e.getMessage(), + "Error reading image data", + JOptionPane.ERROR_MESSAGE ); + e.printStackTrace(); + } + return null; + } + + /** + * Interactively creates a new project from a BDV/XML file. + *

+ * If the specified BDV file cannot be loaded a dialog shows up telling the + * user about the problem, and offering to start Mastodon on substituted + * dummy image data. + * + * @param context + * the current context. + * @param parentComponent + * a component to use as parent to show dialogs during opening. + * Can be null. + * @return a new {@link MamutAppModel}. + * @throws SpimDataException + * if the BDV file that cannot be opened, and the user declined + * to substitute a dummy dataset. + */ + public static MamutAppModel createProjectFromBdvFile( final File file, final Context context, final Component parentComponent ) throws SpimDataException + { + final MamutProject project = MamutProjectIO.fromBdvFile( file ); + try + { + return ProjectLoader.openWithDialog( project, context, parentComponent ); + } + catch ( final IOException e ) + { + // Should not happen because the data model and the GUI state are + // empty. + e.printStackTrace(); + } + return null; + } + + /** + * Interactively creates a new project from a remote file. + *

+ * A dialog is shown to prompt the user for the URL of the image, then + * another one to resave the resulting BDV/XML file pointing to the remote + * URL. + * + * @param context + * the current context. + * @param parentComponent + * a component to use as parent to show dialogs during opening. + * Can be null. + * @return a new {@link MamutAppModel} or null if the user + * clicked cancel, or if the image data cannot be accessed. + */ + public static synchronized MamutAppModel createProjectFromUrl( final Context context, final Component parentComponent ) + { + final String urlString = JOptionPane.showInputDialog( parentComponent, "Please input a url for image data" ); + if ( urlString == null ) + return null; + + SpimData spimData = null; + try + { + spimData = OMEZarrS3Opener.readURL( urlString ); + } + catch ( final RuntimeException e ) + { + final JLabel lblUsername = new JLabel( "Username" ); + final JTextField textFieldUsername = new JTextField(); + final JLabel lblPassword = new JLabel( "Password" ); + final JPasswordField passwordField = new JPasswordField(); + final Object[] ob = { lblUsername, textFieldUsername, lblPassword, passwordField }; + final int result = + JOptionPane.showConfirmDialog( parentComponent, ob, "Please input credentials", JOptionPane.OK_CANCEL_OPTION ); + + if ( result == JOptionPane.OK_OPTION ) + { + final String username = textFieldUsername.getText(); + final char[] password = passwordField.getPassword(); + try + { + S3Utils.setS3AccessAndSecretKey( new String[] { username, new String( password ) } ); + } + finally + { + Arrays.fill( password, '0' ); + } + try + { + spimData = OMEZarrS3Opener.readURL( urlString ); + } + catch ( final Exception e1 ) + { + e1.printStackTrace(); + } + } + else + { + return null; + } + } + catch ( final Exception e ) + { + e.printStackTrace(); + } + + final File file = FileChooser.chooseFile( + parentComponent, + null, + new XmlFileFilter(), + "Save BigDataViewer File", + FileChooser.DialogType.SAVE, + NEW_ICON_MEDIUM.getImage() ); + if ( file == null ) + return null; + + final XmlIoSpimData xmlIoSpimData = new XmlIoSpimData(); + spimData.setBasePath( file.getParentFile() ); + try + { + xmlIoSpimData.save( spimData, file.getAbsolutePath() ); + return ProjectLoader.open( MamutProjectIO.fromBdvFile( file ), context ); + } + catch ( final IOException | SpimDataException e ) + { + e.printStackTrace(); + } + return null; + } +} diff --git a/src/main/java/org/mastodon/mamut/io/ProjectExporter.java b/src/main/java/org/mastodon/mamut/io/ProjectExporter.java new file mode 100644 index 000000000..481ff9d6d --- /dev/null +++ b/src/main/java/org/mastodon/mamut/io/ProjectExporter.java @@ -0,0 +1,70 @@ +package org.mastodon.mamut.io; + +import static org.mastodon.app.MastodonIcons.MAMUT_EXPORT_ICON_MEDIUM; +import static org.mastodon.mamut.io.ProjectSaver.EXT_DOT_MASTODON; +import static org.mastodon.mamut.io.ProjectSaver.stripExtensionIfPresent; + +import java.awt.Component; +import java.io.File; +import java.io.IOException; + +import javax.swing.JOptionPane; + +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.importer.trackmate.MamutExporter; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.ui.util.FileChooser; +import org.mastodon.ui.util.XmlFileFilter; + +/** + * Static methods for exporting projects to other file formats. + */ +public class ProjectExporter +{ + + public static synchronized void exportMamut( final MamutAppModel appModel, final Component parentComponent ) + { + final MamutProject project = appModel.getProject(); + final String filename = getProprosedMamutExportFileName( project ); + + final File file = FileChooser.chooseFile( + parentComponent, + filename, + new XmlFileFilter(), + "Export to MaMuT file", + FileChooser.DialogType.SAVE, + MAMUT_EXPORT_ICON_MEDIUM.getImage() ); + if ( file == null ) + return; + + try + { + MamutExporter.export( file, appModel.getModel(), project ); + } + catch ( final IOException e ) + { + JOptionPane.showMessageDialog( + parentComponent, + "Error exporting to MaMuT file:\n" + e.getMessage(), + "MaMuT export error", + JOptionPane.ERROR_MESSAGE ); + e.printStackTrace(); + } + } + + private static String getProprosedMamutExportFileName( final MamutProject project ) + { + final File pf = project.getProjectRoot(); + if ( pf != null ) + { + final String fn = stripExtensionIfPresent( pf.getName(), EXT_DOT_MASTODON ); + return new File( pf.getParentFile(), fn + "_mamut.xml" ).getAbsolutePath(); + } + else + { + final File f = project.getDatasetXmlFile(); + final String fn = stripExtensionIfPresent( f.getName(), ".xml" ); + return new File( f.getParentFile(), fn + "_mamut.xml" ).getAbsolutePath(); + } + } +} diff --git a/src/main/java/org/mastodon/mamut/io/ProjectImporter.java b/src/main/java/org/mastodon/mamut/io/ProjectImporter.java new file mode 100644 index 000000000..4924f6c38 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/io/ProjectImporter.java @@ -0,0 +1,105 @@ +package org.mastodon.mamut.io; + +import static org.mastodon.app.MastodonIcons.MAMUT_IMPORT_ICON_MEDIUM; + +import java.awt.Component; +import java.awt.Frame; +import java.io.File; +import java.io.IOException; + +import javax.swing.JOptionPane; + +import org.mastodon.feature.FeatureSpecsService; +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.importer.simi.SimiImportDialog; +import org.mastodon.mamut.importer.tgmm.TgmmImportDialog; +import org.mastodon.mamut.importer.trackmate.TrackMateImporter; +import org.mastodon.ui.util.FileChooser; +import org.mastodon.ui.util.XmlFileFilter; +import org.scijava.Context; + +import mpicbg.spim.data.SpimDataException; + +/** + * Static methods for creating projects from other file formats. + */ +public class ProjectImporter +{ + + /** + * Creates and opens a new Mastodon project from a Fiji MaMuT file. The user + * is prompted for the MaMuT file. + * + * @param parentComponent + * a component used as parent for dialogs. + * @param context + * the current context. + * @return the loaded {@link MamutAppModel}, or null if the + * user cancels loading or if there is a problem reading the data. + */ + public static synchronized MamutAppModel openMamutWithDialog( final Component parentComponent, final Context context ) + { + final File file = FileChooser.chooseFile( + parentComponent, + null, + new XmlFileFilter(), + "Import MaMuT Project", + FileChooser.DialogType.LOAD, + MAMUT_IMPORT_ICON_MEDIUM.getImage() ); + if ( file == null ) + return null; + + try + { + final TrackMateImporter importer = new TrackMateImporter( file ); + final MamutAppModel appModel = ProjectLoader.openWithDialog( importer.createProject(), context, parentComponent ); + final FeatureSpecsService featureSpecsService = context.getService( FeatureSpecsService.class ); + importer.readModel( appModel.getModel(), featureSpecsService ); + return appModel; + } + catch ( IOException | SpimDataException e ) + { + JOptionPane.showMessageDialog( + parentComponent, + "Problem reading MaMuT file:\n" + e.getMessage(), + "Error reading MaMuT file", + JOptionPane.ERROR_MESSAGE ); + e.printStackTrace(); + } + return null; + } + + /** + * Shows an importer window that allows importing data from a Simi Biocell + * file. The cell data is added to the existing project. + * + * @see http://www.simi.com/en/products/cell-research.html + * + * @param appModel + * the project to add the data to. + * @param parentComponent + * a frame to use as parent for the dialog. + */ + public static synchronized void importSimiDataWithDialog( final MamutAppModel appModel, final Frame parentComponent ) + { + final SimiImportDialog simiImportDialog = new SimiImportDialog( parentComponent ); + simiImportDialog.showImportDialog( appModel.getSharedBdvData().getSpimData(), appModel.getModel() ); + } + + /** + * Shows an importer window that allows importing data from a TGMM file. The + * cell data is added to the existing project. + * + * @see https://github.com/KellerLabTeam/tgmm-docker + * + * @param appModel + * the project to add the data to. + * @param parentComponent + * a frame to use as parent for the dialog. + */ + public static synchronized void importTgmmDataWithDialog( final MamutAppModel appModel, final Frame parentComponent ) + { + final TgmmImportDialog tgmmImportDialog = new TgmmImportDialog( parentComponent ); + tgmmImportDialog.showImportDialog( appModel.getSharedBdvData().getSpimData(), appModel.getModel() ); + } +} diff --git a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java new file mode 100644 index 000000000..913b555b9 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java @@ -0,0 +1,532 @@ +package org.mastodon.mamut.io; + +import static org.mastodon.app.MastodonIcons.LOAD_ICON_MEDIUM; + +import java.awt.Component; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +import javax.swing.JOptionPane; + +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.JDOMException; +import org.jdom2.input.SAXBuilder; +import org.mastodon.graph.io.RawGraphIO.FileIdToGraphMap; +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.feature.MamutRawFeatureModelIO; +import org.mastodon.mamut.io.project.MamutImagePlusProject; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; +import org.mastodon.mamut.model.Link; +import org.mastodon.mamut.model.Model; +import org.mastodon.mamut.model.Spot; +import org.mastodon.ui.keymap.KeymapManager; +import org.mastodon.ui.util.ExtensionFileFilter; +import org.mastodon.ui.util.FileChooser; +import org.mastodon.ui.util.FileChooser.SelectionMode; +import org.mastodon.util.DummySpimData; +import org.mastodon.views.bdv.SharedBigDataViewerData; +import org.scijava.Context; +import org.scijava.ui.behaviour.KeyPressedManager; + +import ij.IJ; +import ij.ImagePlus; +import mpicbg.spim.data.SpimDataException; +import mpicbg.spim.data.SpimDataIOException; +import mpicbg.spim.data.XmlKeys; + +/** + * Static methods to open a Mastodon Mamut project. + */ +public class ProjectLoader +{ + + static final String GUI_TAG = "MamutGui"; + + static final String WINDOWS_TAG = "Windows"; + + private static File proposedProjectRoot; + + private static MamutProject project; + + /** + * Opens a project. The GUI state is not restored. + * + * @param project + * the object describing the project on disk. + * @param context + * the current context. + * @return the loaded {@link MamutAppModel}. + * @throws IOException + * if the project points to a regular image file for image data, + * and that file cannot be opened properly, or if there is a + * problem loading the model data, or if there is a problem + * reading the GUI state. + * @throws SpimDataException + * if the project points to a BDV file for image data, and that + * BDV cannot be opened properly. + */ + public static MamutAppModel open( final MamutProject project, final Context context ) throws IOException, SpimDataException + { + return open( project, context, false, false ); + } + + /** + * Opens a specified project. + * + * @param project + * the object describing the project on disk. + * @param context + * the current context. + * @param restoreGUIState + * if true, the GUI state will be restored. + * @param authorizeSubstituteDummyData + * if true, and if the image data cannot be loaded, + * a dummy image data will be substituted. In that case a + * {@link SpimDataException} is never thrown. + * @return the loaded {@link MamutAppModel}. + * @throws IOException + * if the project points to a regular image file for image data, + * and that file cannot be opened properly, or if there is a + * problem loading the model data, or if there is a problem + * reading the GUI state. + * @throws SpimDataException + * if the project points to a BDV file for image data, and that + * BDV cannot be opened properly. + */ + public static MamutAppModel open( final MamutProject project, final Context context, final boolean restoreGUIState, final boolean authorizeSubstituteDummyData ) throws IOException, SpimDataException + { + final SharedBigDataViewerData imageData = loadImageData( project, authorizeSubstituteDummyData ); + final Model model = loadModel( project, context ); + final KeyPressedManager keyPressedManager = new KeyPressedManager(); + final KeymapManager keymapManager = new KeymapManager(); + final MamutAppModel appModel = new MamutAppModel( context, model, imageData, keyPressedManager, keymapManager, project ); + + if ( restoreGUIState ) + loadGUI( project, appModel.getWindowManager() ); + + return appModel; + } + + /** + * Opens a project interactively, prompting the user for the project file. + *

+ * If the image data cannot be loaded a dialog shows up telling the user + * about the problem, and offering to start Mastodon on substituted dummy + * image data. If the user declines, a {@link SpimDataException} is thrown. + *

+ * The GUI state is restored. + * + * @param context + * the current context. + * @param parentComponent + * a component to use as parent to show dialogs during opening. + * Can be null. + * @return the loaded {@link MamutAppModel}. + * @throws IOException + * if the project points to a regular image file for image data, + * and that file cannot be opened properly, or if there is a + * problem loading the model data, or if there is a problem + * reading the GUI state. + * @throws SpimDataException + * if the project points to a BDV file that cannot be opened, + * and the user declined to substitute a dummy dataset. + */ + public static final MamutAppModel openWithDialog( final Context context, final Component parentComponent ) + { + String fn = null; + if ( proposedProjectRoot != null ) + fn = proposedProjectRoot.getAbsolutePath(); + else if ( project != null && project.getProjectRoot() != null ) + fn = project.getProjectRoot().getAbsolutePath(); + final File file = FileChooser.chooseFile( + true, + parentComponent, + fn, + new ExtensionFileFilter( "mastodon" ), + "Open Mastodon Project", + FileChooser.DialogType.LOAD, + SelectionMode.FILES_AND_DIRECTORIES, + LOAD_ICON_MEDIUM.getImage() ); + if ( file == null ) + return null; + + try + { + proposedProjectRoot = file; + final MamutProject project = MamutProjectIO.load( file.getAbsolutePath() ); + return openWithDialog( project, context, parentComponent ); + } + catch ( final IOException | SpimDataException e ) + { + JOptionPane.showMessageDialog( + parentComponent, + "Problem reading Mastodon file:\n" + e.getMessage(), + "Error reading Mastodon file", + JOptionPane.ERROR_MESSAGE ); + } + return null; + } + + /** + * Opens a project interactively. + *

+ * If the image data cannot be loaded a dialog shows up telling the user + * about the problem, and offering to start Mastodon on substituted dummy + * image data. If the user declines, a {@link SpimDataException} is thrown. + *

+ * The GUI state is restored. + * + * @param project + * the object describing the project on disk. + * @param context + * the current context. + * + * @return the loaded {@link MamutAppModel}. + * @throws IOException + * if the project points to a regular image file for image data, + * and that file cannot be opened properly, or if there is a + * problem loading the model data, or if there is a problem + * reading the GUI state. + * @throws SpimDataException + * if the project points to a BDV file that cannot be opened, + * and the user declined to substitute a dummy dataset. + */ + public static synchronized MamutAppModel openWithDialog( final MamutProject project, final Context context ) throws IOException, SpimDataException + { + return openWithDialog( project, context, null ); + } + + /** + * Opens a project interactively. + *

+ * If the image data cannot be loaded a dialog shows up telling the user + * about the problem, and offering to start Mastodon on substituted dummy + * image data. + *

+ * The GUI state is restored. + * + * @param project + * the object describing the project on disk. + * @param context + * the current context. + * @param parentComponent + * a component to use as parent to show dialogs during opening. + * Can be null. + * @throws IOException + * if the project points to a regular image file for image data, + * and that file cannot be opened properly and the user declined + * to substitute dummy data; or if there is a problem loading + * the model data; or if there is a problem reading the GUI + * state. + * @throws SpimDataException + * if the project points to a BDV file that cannot be opened, + * and the user declined to substitute a dummy dataset. + * @return the loaded {@link MamutAppModel}. + */ + public static synchronized MamutAppModel openWithDialog( final MamutProject project, final Context context, final Component parentComponent ) throws IOException, SpimDataException + { + try + { + return open( project, context, true, false ); + } + catch ( final SpimDataIOException | RuntimeException e ) + { + if ( getUserPermissionToOpenDummyData( project, e, parentComponent ) ) + return open( project, context, true, true ); + + throw e; + } + } + + /** + * Loads the image data stored in a project, and wraps in a + * {@link SharedBigDataViewerData}. + * + * @param project + * the project. + * @param authorizeSubstituteDummyData + * if true, and if the image data cannot be loaded, + * a dummy image data will be substituted. In that case a + * {@link SpimDataException} is never thrown. + * @return a new {@link SharedBigDataViewerData}. + * @throws IOException + * if the project points to a regular image file for image data, + * and that file cannot be opened properly. + * @throws SpimDataException + * if the project points to a BDV file for image data, and that + * BDV cannot be opened properly, and + * authorizeSubstituteDummyData is false. + */ + public static SharedBigDataViewerData loadImageData( final MamutProject project, final boolean authorizeSubstituteDummyData ) throws SpimDataException, IOException + { + // Check to what kind of data points the image file. + final String canonicalPath = project.getDatasetXmlFile().getAbsolutePath(); + + if ( DummySpimData.isDummyString( canonicalPath ) ) + { + // Opening a project with standard BDV (or DUMMY) image data + return SharedBigDataViewerData.fromDummyFilename( canonicalPath ); + } + else if ( !canonicalPath.endsWith( ".xml" ) ) + { + // Opening a project with a path to a regular image. + final ImagePlus imp; + // Do we have the ImagePlus already in memory? + if ( project instanceof MamutImagePlusProject ) + { + imp = ( ( MamutImagePlusProject ) project ).getImagePlus(); + } + else + { + // Assume the path points to a plain image file. + imp = IJ.openImage( canonicalPath ); + // If it does not work tell the user. + if ( imp == null ) + throw new IOException( "Cannot open image " + canonicalPath ); + } + return SharedBigDataViewerData.fromImagePlus( imp ); + } + else + { + // Opening a project that points to a BDV file. + + // Try to open a BDV file. If it fails, substitute dummy data. + if ( authorizeSubstituteDummyData ) + return openDummyImageData( project ); + + // Try to open a BDV file. If it fails, crash. + return SharedBigDataViewerData.fromSpimDataXmlFile( project.getDatasetXmlFile().getAbsolutePath() ); + } + } + + /** + * Loads a {@link Model} from a project file. + * + * @param project + * the project to load from. + * @param context + * the current context, used to get feature serializers. + * @return a new model. + * @throws IOException + * if there is a problem reading the project. + */ + public static final Model loadModel( final MamutProject project, final Context context ) throws IOException + { + final Model model = new Model( project.getSpaceUnits(), project.getTimeUnits() ); + final boolean isNewProject = project.getProjectRoot() == null; + if ( !isNewProject ) + { + try (final MamutProject.ProjectReader reader = project.openForReading()) + { + final FileIdToGraphMap< Spot, Link > idmap = model.loadRaw( reader ); + // Load features. + MamutRawFeatureModelIO.deserialize( + context, + model, + idmap, + reader ); + } + catch ( final ClassNotFoundException e ) + { + e.printStackTrace(); + } + } + + model.setSavePoint(); + model.declareDefaultFeatures(); + return model; + } + + /** + * Recreates the GUI configuration saved in the specified project. When + * calling this method, windows are created and shown on the display. + * + * @param project + * the project to read from. + * @param windowManager + * a window manager instance, used to create windows. + * @throws IOException + * if there is a problem reading the project. + */ + public static final void loadGUI( final MamutProject project, final WindowManager windowManager ) throws IOException + { + try (final MamutProject.ProjectReader reader = project.openForReading()) + { + try + { + + final SAXBuilder sax = new SAXBuilder(); + Document guiDoc; + try (InputStream inputStream = reader.getGuiInputStream()) + { + guiDoc = sax.build( inputStream ); + } + catch ( final JDOMException e ) + { + throw new IOException( e ); + } + final Element root = guiDoc.getRootElement(); + if ( !GUI_TAG.equals( root.getName() ) ) + throw new IOException( "expected <" + GUI_TAG + "> root element. wrong file?" ); + + final Element windowsEl = root.getChild( WINDOWS_TAG ); + if ( null == windowsEl ) + return; + + MamutViewStateSerialization.fromXml( windowsEl, windowManager ); + } + catch ( final FileNotFoundException fnfe ) + { + // Ignore missing gui file. + } + } + } + + /** + * Shows an dialog the explains to the user why the image data could not + * been loaded, and offers to open Mastodon with dummy image data. + */ + private static boolean getUserPermissionToOpenDummyData( final MamutProject project, final Exception e, final Component parentComponent ) + { + final String problemDescription = getProblemDescription( project, e ); + System.err.println( problemDescription ); + final String title = "Problem Opening Mastodon Project"; + String message = ""; + message += "Mastodon could not find the images associated with this project.\n"; + message += "\n"; + message += problemDescription + "\n"; + message += "\n"; + message += "It is still possible to open the project.\n"; + message += "You can inspect and modify the tracking data.\n"; + message += "But you won't be able to see the image data.\n"; + message += "\n"; + message += "You may fix this problem by correcting the image path in the Mastodon project.\n"; + message += "In the Mastodon menu select: File -> Fix Image Path.\n"; + message += "\n"; + message += "How would you like to continue?"; + final String[] options = { "Open With Dummy Images", "Cancel" }; + final int dialogResult = JOptionPane.showOptionDialog( parentComponent, message, title, JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE, null, options, null ); + return dialogResult == JOptionPane.YES_OPTION; + } + + private static String getProblemDescription( final MamutProject project, final Exception e ) + { + final File datasetXml = project.getDatasetXmlFile(); + if ( !datasetXml.exists() ) + return "The image data XML was not found:\n" + datasetXml; + final Throwable cause = e.getCause(); + if ( cause instanceof UnknownHostException ) + return errorMessageUnknownHost( datasetXml, cause.getMessage() ); + return e.getMessage(); + } + + private static String errorMessageUnknownHost( final File datasetXml, final String host ) + { + final SAXBuilder sax = new SAXBuilder(); + try + { + final Document doc = sax.build( datasetXml ); + final Element root = doc.getRootElement(); + final String baseUrl = root + .getChild( XmlKeys.SEQUENCEDESCRIPTION_TAG ) + .getChild( XmlKeys.IMGLOADER_TAG ) + .getChildText( "baseUrl" ); + return "Cannot reach host " + host + " for the dataset URL: " + baseUrl; + } + catch ( final Exception e ) + { + return "Unparsable dataset file: " + e.getMessage(); + } + } + + private static SharedBigDataViewerData openDummyImageData( final MamutProject project ) + { + try + { + final String backupDatasetXml = originalOrBackupDatasetXml( project ).getAbsolutePath(); + return SharedBigDataViewerData.createDummyDataFromSpimDataXml( backupDatasetXml ); + } + catch ( final Throwable e ) + { + return simpleDummyData( project ); + } + } + + static File originalOrBackupDatasetXml( final MamutProject project ) + { + try + { + final File datasetXml = project.getDatasetXmlFile(); + if ( datasetXml.exists() ) + return datasetXml; + else + return copyBackupDatasetXmlToTmpFile( project ); + } + catch ( final IOException e ) + { + return null; + } + } + + private static File copyBackupDatasetXmlToTmpFile( final MamutProject project ) throws IOException + { + try (final MamutProject.ProjectReader reader = project.openForReading(); + final InputStream is = reader.getBackupDatasetXmlInputStream()) + { + final File tmp = File.createTempFile( "mastodon-dataset-xml-backup", ".xml" ); + tmp.deleteOnExit(); + Files.copy( is, tmp.toPath(), StandardCopyOption.REPLACE_EXISTING ); + return tmp; + } + } + + private static SharedBigDataViewerData simpleDummyData( final MamutProject project ) + { + try (final MamutProject.ProjectReader reader = project.openForReading()) + { + final Model model = new Model( project.getSpaceUnits(), project.getTimeUnits() ); + model.loadRaw( reader ); + final String requiredImageSizeAsString = requiredImageSizeAsString( model ); + return SharedBigDataViewerData.fromDummyFilename( requiredImageSizeAsString ); + } + catch ( final IOException e ) + { + throw new RuntimeException( e ); + } + } + + private static String requiredImageSizeAsString( final Model model ) + { + int time = 0; + double x = 0; + double y = 0; + double z = 0; + for ( final Spot spot : model.getGraph().vertices() ) + { + time = Math.max( time, spot.getTimepoint() ); + final double radius = Math.sqrt( spot.getBoundingSphereRadiusSquared() ); + x = Math.max( x, spot.getDoublePosition( 0 ) + radius ); + y = Math.max( y, spot.getDoublePosition( 1 ) + radius ); + z = Math.max( z, spot.getDoublePosition( 2 ) + radius ); + } + return String.format( "x=%s y=%s z=%s t=%s.dummy", + roundUp( x ) + 1, + roundUp( y ) + 1, + roundUp( z ) + 1, + time + 1 ); + } + + private static long roundUp( final double x ) + { + return ( long ) Math.ceil( x ); + } +} diff --git a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java new file mode 100644 index 000000000..7f42e6b1c --- /dev/null +++ b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java @@ -0,0 +1,393 @@ +package org.mastodon.mamut.io; + +import static org.mastodon.app.MastodonIcons.SAVE_ICON_MEDIUM; +import static org.mastodon.mamut.io.ProjectLoader.GUI_TAG; +import static org.mastodon.mamut.io.ProjectLoader.WINDOWS_TAG; +import static org.mastodon.mamut.io.project.MamutProjectIO.MAMUTPROJECT_VERSION_ATTRIBUTE_CURRENT; +import static org.mastodon.mamut.io.project.MamutProjectIO.MAMUTPROJECT_VERSION_ATTRIBUTE_NAME; + +import java.awt.Component; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowListener; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; +import java.nio.file.Files; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; + +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.output.Format; +import org.jdom2.output.XMLOutputter; +import org.mastodon.app.MastodonIcons; +import org.mastodon.graph.io.RawGraphIO.GraphToFileIdMap; +import org.mastodon.mamut.MainWindow; +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.feature.MamutRawFeatureModelIO; +import org.mastodon.mamut.io.project.MamutImagePlusProject; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProject.ProjectWriter; +import org.mastodon.mamut.io.project.MamutProjectIO; +import org.mastodon.mamut.model.Link; +import org.mastodon.mamut.model.Model; +import org.mastodon.mamut.model.Spot; +import org.mastodon.ui.keymap.KeymapManager; +import org.mastodon.ui.util.ExtensionFileFilter; +import org.mastodon.ui.util.FileChooser; +import org.mastodon.ui.util.FileChooser.SelectionMode; +import org.mastodon.util.BDVImagePlusExporter; +import org.mastodon.views.bdv.SharedBigDataViewerData; +import org.scijava.Context; +import org.scijava.ui.behaviour.KeyPressedManager; + +import ij.gui.ImageWindow; + +/** + * Static methods to save project to a Mastodon Mamut file. + */ +public class ProjectSaver +{ + + /** + * Interactively saves the specified project. A dialog is shown prompting + * the user to a save path. + * + * @param appModel + * the project model. + * @param parentComponent + * a component to use as parent to show dialogs during opening. + * Can be null. + */ + public static synchronized void saveProjectAs( final MamutAppModel appModel, final Component parentComponent ) + { + final MamutProject project = appModel.getProject(); + final String projectRoot = getProposedProjectRoot( project ); + + new Thread( new Runnable() + { + @Override + public void run() + { + try + { + + /* + * Check if the image data is based on a non-BDV image. If + * it's the case, offer to convert. + */ + + if ( project instanceof MamutImagePlusProject ) + { + + final AtomicInteger returnUserValue = new AtomicInteger( -1 ); + SwingUtilities.invokeAndWait( new Runnable() + { + + @Override + public void run() + { + final int val = JOptionPane.showConfirmDialog( + parentComponent, + "The image data is not currently saved as a BDV file, \n" + + "which is optimal for Mastodon. Mastodon might fail \n" + + "to load the image data when you will reopen the \n" + + "project you are about to save.\n" + + "\n" + + "Do you want to resave the image to the BDV file \n" + + "format prior to saving the Mastodon project? \n" + + "\n" + + "(Clicking 'Yes' will show the BDV exporter \n" + + "interface and close all Mastodon windows, \n" + + "then offer to save the Mastodon project.)", + "Image not in BDV file format", + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, + MastodonIcons.MASTODON_ICON_MEDIUM ); + returnUserValue.set( val ); + } + } ); + + if ( returnUserValue.get() == JOptionPane.YES_OPTION ) + { + /* + * If the user chose to resave to BDV, then we make + * a new project out of the new data, save it and + * reopen it. + */ + saveAndReopenImagePlusProject( appModel, parentComponent ); + return; + } + } + + /* + * Ask for a file path to save to. + */ + + SwingUtilities.invokeAndWait( new Runnable() + { + @Override + public void run() + { + final File file = FileChooser.chooseFile( true, + parentComponent, + projectRoot, + new ExtensionFileFilter( "mastodon" ), + "Save Mastodon Project", + FileChooser.DialogType.SAVE, + SelectionMode.FILES_ONLY, + SAVE_ICON_MEDIUM.getImage() ); + if ( file == null ) + return; + + new Thread( () -> { + try + { + saveProject( file, appModel ); + } + catch ( final IOException e ) + { + JOptionPane.showMessageDialog( + parentComponent, + "Could not save project:\n" + e.getMessage(), + "Error writing to file", + JOptionPane.ERROR_MESSAGE ); + e.printStackTrace(); + } + } ).start(); + } + } ); + } + catch ( final InterruptedException | InvocationTargetException | IOException e ) + { + JOptionPane.showMessageDialog( + parentComponent, + "Problem writing the project:\n" + e.getMessage(), + "Error writing to file", + JOptionPane.ERROR_MESSAGE ); + e.printStackTrace(); + } + } + } ).start(); + } + + /** + * Saves the specified project to the file specified in its + * {@link MamutProject} object. + * + * @param appModel + * the project model. + * @param parentComponent + * a component to use as parent to show dialogs during opening. + * Can be null. + */ + public static void saveProject( final MamutAppModel appModel, final Component parentComponent ) + { + try + { + saveProject( appModel.getProject().getProjectRoot(), appModel ); + } + catch ( final IOException e ) + { + JOptionPane.showMessageDialog( + parentComponent, + "Could not save project:\n" + e.getMessage(), + "Error writing to file", + JOptionPane.ERROR_MESSAGE ); + e.printStackTrace(); + } + } + + /** + * Saves the specified project to the specified file. The file should be a + * path ending in .mastodon (but folders from previous versions + * are supported). + * + * @param saveTo + * the file to save the project to. + * @param appModel + * the project model. + * @throws IOException + * if there is an error writing to the file. + */ + public static synchronized void saveProject( final File saveTo, final MamutAppModel appModel ) throws IOException + { + // Current project. + final MamutProject project = appModel.getProject(); + final File tmpDatasetXml = ProjectLoader.originalOrBackupDatasetXml( project ); + + // Possibly update project root. + project.setProjectRoot( saveTo ); + try (final MamutProject.ProjectWriter writer = project.openForWriting()) + { + MamutProjectIO.save( project, writer ); + final Model model = appModel.getModel(); + final GraphToFileIdMap< Spot, Link > idmap = model.saveRaw( writer ); + // Serialize feature model. + MamutRawFeatureModelIO.serialize( appModel.getContext(), model, idmap, writer ); + // Serialize GUI state. + saveGUI( writer, appModel.getWindowManager() ); + // Save a copy of the Spim Data Xml File + saveBackupDatasetXml( tmpDatasetXml, writer ); + // Set save point. + model.setSavePoint(); + } + } + + /** + * Serialize window positions and states. + * + * @throws IOException + * if an error occurs when writing to the GUI file. + */ + private static void saveGUI( final ProjectWriter writer, final WindowManager windowManager ) throws IOException + { + final Element guiRoot = new Element( GUI_TAG ); + guiRoot.setAttribute( MAMUTPROJECT_VERSION_ATTRIBUTE_NAME, MAMUTPROJECT_VERSION_ATTRIBUTE_CURRENT ); + final Element windows = new Element( WINDOWS_TAG ); + windowManager.forEachView( ( view ) -> windows.addContent( MamutViewStateSerialization.toXml( view ) ) ); + windowManager.forEachBranchView( ( view ) -> windows.addContent( MamutViewStateSerialization.toXml( view ) ) ); + guiRoot.addContent( windows ); + final Document doc = new Document( guiRoot ); + final XMLOutputter xout = new XMLOutputter( Format.getPrettyFormat() ); + try (OutputStream outputStream = writer.getGuiOutputStream()) + { + xout.output( doc, outputStream ); + } + } + + /** + * Saves a copy of the dataset.xml (if there is any) to the projection + * location. + * + * @throws IOException + * if there is an IO error when creating the backup. + */ + private static void saveBackupDatasetXml( final File tmpDatasetXml, final ProjectWriter projectWriter ) throws IOException + { + if ( tmpDatasetXml == null ) + return; + + try (OutputStream out = projectWriter.getBackupDatasetXmlOutputStream()) + { + Files.copy( tmpDatasetXml.toPath(), out ); + } + } + + private static String getProposedProjectRoot( final MamutProject project ) + { + if ( project.getProjectRoot() != null ) + return project.getProjectRoot().getAbsolutePath(); + else + { + final File f = project.getDatasetXmlFile(); + final String fn = stripExtensionIfPresent( f.getName(), ".xml" ); + return new File( f.getParentFile(), fn + EXT_DOT_MASTODON ).getAbsolutePath(); + } + } + + static final String EXT_DOT_MASTODON = ".mastodon"; + + static String stripExtensionIfPresent( final String fn, final String ext ) + { + return fn.endsWith( ext ) + ? fn.substring( 0, fn.length() - ext.length() ) + : fn; + } + + private static void saveAndReopenImagePlusProject( final MamutAppModel appModel, final Component parentComponent ) throws IOException + { + final MamutImagePlusProject project = ( MamutImagePlusProject ) appModel.getProject(); + + // Export imp to BDV. + final String projectRoot = getProposedProjectRoot( project ); + final int n = projectRoot.indexOf( '.' ); + final String proposedXmlFile = projectRoot.subSequence( 0, n ).toString() + ".xml"; + final File bdvFile = BDVImagePlusExporter.export( project.getImagePlus(), proposedXmlFile ); + + /* + * Create a settings file for the BDV file with what we can put in, + * inferred from the existing SharedBigDataViewerData created from the + * imp. + */ + final Element root = new Element( "Settings" ); + final SharedBigDataViewerData sbdv = appModel.getSharedBdvData(); + root.addContent( sbdv.getManualTransformation().toXml() ); + @SuppressWarnings( "deprecation" ) + final Element setupAssignmentsXml = sbdv.getSetupAssignments().toXml(); + root.addContent( setupAssignmentsXml ); + root.addContent( sbdv.getBookmarks().toXml() ); + final Document doc = new Document( root ); + final XMLOutputter xout = new XMLOutputter( Format.getPrettyFormat() ); + final String xmlFilename = bdvFile.getAbsolutePath(); + final String settings = xmlFilename.substring( 0, xmlFilename.length() - ".xml".length() ) + + ".settings" + ".xml"; + xout.output( doc, new FileWriter( settings ) ); + + // Make a new project pointing to the new BDV file. + final MamutProject np = new MamutProject( new File( projectRoot ), bdvFile ); + np.setSpaceUnits( project.getSpaceUnits() ); + np.setTimeUnits( project.getTimeUnits() ); + + // Remove listener to imp window closing. + final ImageWindow window = project.getImagePlus().getWindow(); + if ( window != null ) + { + for ( final WindowListener wl : window.getWindowListeners() ) + window.removeWindowListener( wl ); + + window.addWindowListener( new WindowAdapter() + { + @Override + public void windowClosing( final java.awt.event.WindowEvent e ) + { + project.getImagePlus().close(); + } + } ); + } + + // And now the weird part: we reopen the project we just created. + final Context context = appModel.getContext(); + final Model model = appModel.getModel(); + final KeyPressedManager keyPressedManager = new KeyPressedManager(); + final KeymapManager keymapManager = new KeymapManager(); + final MamutAppModel nmam = new MamutAppModel( context, model, sbdv, keyPressedManager, keymapManager, np ); + + // Close the old one. + appModel.close(); + + // Offer to save the new project. + final File file = FileChooser.chooseFile( true, + parentComponent, + projectRoot, + new ExtensionFileFilter( "mastodon" ), + "Save Mastodon Project", + FileChooser.DialogType.SAVE, + SelectionMode.FILES_ONLY, + SAVE_ICON_MEDIUM.getImage() ); + if ( file == null ) + return; + + try + { + saveProject( file, nmam ); + } + catch ( final IOException e ) + { + JOptionPane.showMessageDialog( + parentComponent, + "Could not save project:\n" + e.getMessage(), + "Error writing to file", + JOptionPane.ERROR_MESSAGE ); + e.printStackTrace(); + } + + // Show the UI for the new one. + new MainWindow( nmam ).setVisible( true ); + } +} diff --git a/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java b/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java index 474874a6a..5839ea4b6 100644 --- a/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java +++ b/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java @@ -40,6 +40,7 @@ import org.jdom2.output.XMLOutputter; import org.mastodon.io.IOUtils; +import ij.ImagePlus; import mpicbg.spim.data.XmlHelpers; public class MamutProjectIO @@ -65,11 +66,24 @@ public class MamutProjectIO * the path to the BDV file (the XML file). * @return a new {@link MamutProject}. */ - public static final MamutProject emptyProject( final File datasetXmlFile ) + public static final MamutProject fromBdvFile( final File datasetXmlFile ) { return new MamutProject( null, datasetXmlFile ); } + /** + * Returns a new project object for a new empty project operating on the + * image data in the specified {@link ImagePlus}. + * + * @param imp + * the image. + * @return a new {@link MamutProject}. + */ + public static MamutImagePlusProject fromImagePlus( final ImagePlus imp ) + { + return new MamutImagePlusProject( imp ); + } + /** * Saves the project description via the specified project writer. * diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java index 268028b5e..2048d3384 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java @@ -28,20 +28,21 @@ */ package org.mastodon.mamut.launcher; +import java.io.IOException; +import java.util.ArrayList; + import org.mastodon.mamut.MainWindow; -import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; -import org.scijava.io.IOPlugin; import org.scijava.io.AbstractIOPlugin; +import org.scijava.io.IOPlugin; import org.scijava.io.location.FileLocation; import org.scijava.io.location.Location; +import org.scijava.log.LogService; import org.scijava.plugin.Parameter; import org.scijava.plugin.Plugin; -import org.scijava.log.LogService; - -import java.io.IOException; -import java.util.ArrayList; @Plugin( type = IOPlugin.class ) public class MastodonDndLauncher extends AbstractIOPlugin< Object > @@ -51,7 +52,7 @@ public class MastodonDndLauncher extends AbstractIOPlugin< Object > private LogService logService; @Override - public boolean supportsOpen( Location source ) + public boolean supportsOpen( final Location source ) { final String sourcePath = source.getURI().getPath(); logService.debug( "MastodonDndLauncher was questioned: " + sourcePath ); @@ -62,32 +63,27 @@ public boolean supportsOpen( Location source ) } @Override - public Object open( Location source ) throws IOException + public Object open( final Location source ) throws IOException { logService.debug( "MastodonDndLauncher was asked to open: " + source.getURI().getPath() ); final FileLocation fsource = source instanceof FileLocation ? ( FileLocation ) source : null; if ( fsource == null ) - return null; //NB: shouldn't happen... (in theory) + return null; // NB: shouldn't happen... (in theory) final String projectPath = fsource.getFile().getAbsolutePath(); - //make sure that the menus appear on top of the screen - //to look natively in the Apple world + // make sure that the menus appear on top of the screen + // to look natively in the Apple world System.setProperty( "apple.laf.useScreenMenuBar", "true" ); - //start up "the main object behind the scenes" -- the WindowManager, - final WindowManager windowManager = new WindowManager( getContext() ); - try { - final MamutProject project = new MamutProjectIO().load( projectPath ); - windowManager.getProjectManager().openWithDialog( project ); - - //start up the main/central Mastodon window - final MainWindow mainWindow = new MainWindow( windowManager ); + final MamutProject project = MamutProjectIO.load( projectPath ); + final MamutAppModel appModel = ProjectLoader.openWithDialog( project, getContext(), null ); + final MainWindow mainWindow = new MainWindow( appModel ); mainWindow.setVisible( true ); } - catch ( Exception e ) + catch ( final Exception e ) { logService.error( "Error reading Mastodon project file: " + projectPath ); logService.error( "Error was: " + e.getMessage() ); @@ -96,7 +92,7 @@ public Object open( Location source ) throws IOException return FAKE_INPUT; } - //the "innocent" product of the (hypothetical) file reading... + // the "innocent" product of the (hypothetical) file reading... private static final Object FAKE_INPUT = new ArrayList<>( 0 ); @Override diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java index bfa552e56..433b21d7c 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java @@ -45,7 +45,6 @@ import java.util.function.BiFunction; import java.util.function.IntUnaryOperator; -import javax.swing.ActionMap; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; @@ -55,13 +54,13 @@ import org.mastodon.app.MastodonIcons; import org.mastodon.feature.FeatureSpecsService; import org.mastodon.mamut.MainWindow; -import org.mastodon.mamut.ProjectManager; -import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.MamutAppModel; import org.mastodon.mamut.importer.simi.SimiImporter; import org.mastodon.mamut.importer.simi.SimiImporter.LabelFunction; import org.mastodon.mamut.importer.tgmm.TgmmImporter; import org.mastodon.mamut.importer.trackmate.TrackMateImporter; -import org.mastodon.mamut.io.project.MamutImagePlusProject; +import org.mastodon.mamut.io.ProjectCreator; +import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; @@ -142,10 +141,11 @@ private void importSimi() { // Create new blank project from BDV file. final File bdvFile = new File( gui.importSimiBioCellPanel.textAreaBDVFile.getText() ); - final WindowManager windowManager = createWindowManager(); - windowManager.getProjectManager().open( new MamutProject( null, bdvFile ) ); - final Model model = windowManager.getAppModel().getModel(); - final AbstractSpimData< ? > spimData = windowManager.getAppModel().getSharedBdvData().getSpimData(); + final MamutProject project = MamutProjectIO.fromBdvFile( bdvFile ); + final MamutAppModel appModel = ProjectLoader.open( project, context ); + + final Model model = appModel.getModel(); + final AbstractSpimData< ? > spimData = appModel.getSharedBdvData().getSpimData(); final String sbdFilename = gui.importSimiBioCellPanel.textAreaSimiFile.getText(); final int setupIndex = gui.importSimiBioCellPanel.setupComboBox.getSelectedIndex(); @@ -199,7 +199,7 @@ else if ( tp > maxtp ) final boolean interpolateMissingSpots = gui.importSimiBioCellPanel.interpolateCheckBox.isSelected(); SimiImporter.read( sbdFilename, frameToTimepointFunction, labelFunction, positionFunction, radius, interpolateMissingSpots, model ); - new MainWindow( windowManager ).setVisible( true ); + new MainWindow( appModel ).setVisible( true ); dispose(); } catch ( final IOException e ) @@ -245,10 +245,11 @@ private void importTgmm() // Create new blank project from BDV file. final File bdvFile = new File( gui.importTGMMPanel.textAreaBDVFile.getText() ); - final WindowManager windowManager = createWindowManager(); - windowManager.getProjectManager().open( new MamutProject( null, bdvFile ) ); - final Model model = windowManager.getAppModel().getModel(); - final AbstractSpimData< ? > spimData = windowManager.getAppModel().getSharedBdvData().getSpimData(); + final MamutProject project = MamutProjectIO.fromBdvFile( bdvFile ); + final MamutAppModel appModel = ProjectLoader.open( project, context ); + + final Model model = appModel.getModel(); + final AbstractSpimData< ? > spimData = appModel.getSharedBdvData().getSpimData(); // Read setup id. final ViewRegistrations viewRegistrations = spimData.getViewRegistrations(); @@ -276,7 +277,7 @@ private void importTgmm() viewRegistrations, setupID, nSigmas, model ); // Success? We move on. - new MainWindow( windowManager ).setVisible( true ); + new MainWindow( appModel ).setVisible( true ); dispose(); } catch ( final ParseException e ) @@ -350,12 +351,11 @@ private void createNewProject() new Thread( () -> { try { - final WindowManager windowManager = createWindowManager(); - windowManager.getProjectManager().open( new MamutProject( null, file ) ); - new MainWindow( windowManager ).setVisible( true ); + final MamutAppModel appModel = ProjectCreator.createProjectFromBdvFile( file, context, gui ); + new MainWindow( appModel ).setVisible( true ); dispose(); } - catch ( IOException | SpimDataException e ) + catch ( final SpimDataException e ) { gui.newMastodonProjectPanel.labelInfo.setText( "Invalid BDV xml/h5 file.

" + LauncherUtil.toMessage( e ) + "" ); @@ -385,8 +385,9 @@ private void createNewProject() new Thread( () -> { try { - final WindowManager windowManager = createWindowManager(); - final MainWindow mainWindow = new MainWindow( windowManager ); + final MamutProject project = MamutProjectIO.fromImagePlus( imp ); + final MamutAppModel appModel = ProjectLoader.open( project, context ); + final MainWindow mainWindow = new MainWindow( appModel ); /* * Action when user closes source image plus. @@ -417,10 +418,7 @@ public void windowClosing( final WindowEvent e ) MastodonIcons.MASTODON_ICON_MEDIUM ); if ( val == JOptionPane.YES_OPTION ) { - final ActionMap actionMap = - windowManager.getAppModel().getAppActions().getActionMap(); - final boolean hasBeenClosed = mainWindow.close( windowManager, - actionMap.get( ProjectManager.SAVE_PROJECT ), e ); + final boolean hasBeenClosed = mainWindow.close(); if ( hasBeenClosed ) window.close(); } @@ -450,7 +448,6 @@ public void windowClosing( final WindowEvent e ) MastodonIcons.MASTODON_ICON_MEDIUM ); } - windowManager.getProjectManager().open( new MamutImagePlusProject( imp ) ); mainWindow.setVisible( true ); dispose(); } @@ -497,6 +494,9 @@ private void showHelpPanel() gui.showPanel( LauncherGUI.WELCOME_PANEL_KEY ); } + /* + * TODO: Rework using the ProjectCreator methods. + */ private void createProjectFromURL() { final String filepath = gui.openRemoteURLPanel.taFileSave.getText(); @@ -550,16 +550,17 @@ private void createProjectFromURL() /* * Open it as a new Mastodon project. */ - final WindowManager windowManager = createWindowManager(); - windowManager.getProjectManager().open( new MamutProject( null, file ) ); - new MainWindow( windowManager ).setVisible( true ); - dispose(); + final MamutProject project = MamutProjectIO.fromBdvFile( file ); + final MamutAppModel appModel = ProjectLoader.open( project, context ); + new MainWindow( appModel ).setVisible( true ); /* * We update the list of recent projects here so that only * projects that were successfully opened are added to the list. */ RecentProjectsPanel.recentProjects.add( file.getAbsolutePath() ); + + dispose(); } catch ( IOException | SpimDataException e ) { @@ -597,11 +598,12 @@ private void importMaMuT() { final TrackMateImporter importer = new TrackMateImporter( file ); - final WindowManager windowManager = createWindowManager(); - windowManager.getProjectManager().open( importer.createProject() ); + final MamutProject project = importer.createProject(); + final MamutAppModel appModel = ProjectLoader.open( project, context ); + final FeatureSpecsService featureSpecsService = context.getService( FeatureSpecsService.class ); - importer.readModel( windowManager.getAppModel().getModel(), featureSpecsService ); - new MainWindow( windowManager ).setVisible( true ); + importer.readModel( appModel.getModel(), featureSpecsService ); + new MainWindow( appModel ).setVisible( true ); dispose(); } catch ( final IOException | SpimDataException e ) @@ -625,7 +627,6 @@ private void loadMastodonProject( final String projectPath ) try { gui.clearLog(); - final WindowManager windowManager = createWindowManager(); SwingUtilities.invokeLater( () -> { final File file; @@ -654,10 +655,10 @@ private void loadMastodonProject( final String projectPath ) try { - final MamutProject project = new MamutProjectIO().load( file.getAbsolutePath() ); - windowManager.getProjectManager().openWithDialog( project ); + final MamutProject project = MamutProjectIO.load( file.getAbsolutePath() ); + final MamutAppModel appModel = ProjectLoader.open( project, context ); - new MainWindow( windowManager ).setVisible( true ); + new MainWindow( appModel ).setVisible( true ); dispose(); /* * We update the list of recent projects here so that @@ -679,11 +680,6 @@ private void loadMastodonProject( final String projectPath ) } ).start(); } - private WindowManager createWindowManager() - { - return new WindowManager( context ); - } - private class LauncherDropTarget extends DropTarget { private static final long serialVersionUID = 1L; diff --git a/src/main/java/org/mastodon/ui/util/FileChooser.java b/src/main/java/org/mastodon/ui/util/FileChooser.java index ca75f03ea..4d9aea4b4 100644 --- a/src/main/java/org/mastodon/ui/util/FileChooser.java +++ b/src/main/java/org/mastodon/ui/util/FileChooser.java @@ -272,18 +272,4 @@ public static boolean isMac() final String OS = System.getProperty( "os.name", "generic" ).toLowerCase( Locale.ENGLISH ); return ( OS.indexOf( "mac" ) >= 0 ) || ( OS.indexOf( "darwin" ) >= 0 ); } - - /** - * Possible creates the whole directories needed to save a file with the - * specified path. - * - * @param path - * the path. - * @return true if folders have actually been created. - */ - public static boolean mkdirs( final String path ) - { - final File dir = new File( path ).getParentFile(); - return dir == null ? false : dir.mkdirs(); - } } diff --git a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java index 54e7189bf..5f8c46c9d 100644 --- a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java +++ b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java @@ -66,7 +66,6 @@ import bdv.viewer.BasicViewerState; import bdv.viewer.ConverterSetups; import bdv.viewer.DisplayMode; -import bdv.viewer.RequestRepaint; import bdv.viewer.Source; import bdv.viewer.SourceAndConverter; import bdv.viewer.ViewerOptions; @@ -93,6 +92,7 @@ import net.imglib2.realtransform.AffineTransform3D; import net.imglib2.type.numeric.ARGBType; +@SuppressWarnings( "deprecation" ) public class SharedBigDataViewerData { private final ArrayList< SourceAndConverter< ? > > sources; @@ -129,9 +129,7 @@ private SharedBigDataViewerData( final ConverterSetups setups, final SetupAssignments setupAssignments, final CacheControl cache, - final int numTimepoints, - final ViewerOptions options, - final RequestRepaint requestRepaint ) + final int numTimepoints ) { this.spimData = spimData; this.sources = sources; @@ -140,8 +138,9 @@ private SharedBigDataViewerData( this.cache = cache; this.numTimepoints = numTimepoints; - this.inputTriggerConfig = ( options.values.getInputTriggerConfig() != null ) - ? options.values.getInputTriggerConfig() + final ViewerOptions lvo = new ViewerOptions(); + this.inputTriggerConfig = ( lvo.values.getInputTriggerConfig() != null ) + ? lvo.values.getInputTriggerConfig() : new InputTriggerConfig(); this.manualTransformation = new ManualTransformation( sources ); @@ -149,7 +148,7 @@ private SharedBigDataViewerData( this.bookmarks = new Bookmarks(); this.is2D = computeIs2D(); - this.options = options + this.options = lvo .inputTriggerConfig( inputTriggerConfig ) .transformEventHandlerFactory( is2D ? TransformEventHandler2D::new @@ -328,23 +327,16 @@ private boolean computeIs2D() return true; } - public static SharedBigDataViewerData fromSpimDataXmlFile( - final String spimDataXmlFilename, - final ViewerOptions viewerOptions, - final RequestRepaint requestRepaint ) throws SpimDataException + public static SharedBigDataViewerData fromSpimDataXmlFile( final String spimDataXmlFilename ) throws SpimDataException { final AbstractSpimData< ? > spimData = new XmlIoSpimDataMinimal().load( spimDataXmlFilename ); - return formSpimData( spimDataXmlFilename, spimData, viewerOptions, requestRepaint ); + return fromSpimData( spimDataXmlFilename, spimData ); } - public static - SharedBigDataViewerData fromDummyFilename( - final String spimDataXmlFilename, - final ViewerOptions viewerOptions, - final RequestRepaint requestRepaint ) + public static SharedBigDataViewerData fromDummyFilename( final String spimDataXmlFilename ) { final AbstractSpimData< ? > spimData = DummySpimData.tryCreate( spimDataXmlFilename ); - return formSpimData( spimDataXmlFilename, spimData, viewerOptions, requestRepaint ); + return fromSpimData( spimDataXmlFilename, spimData ); } /** @@ -355,20 +347,15 @@ SharedBigDataViewerData fromDummyFilename( * * @return a "dummy" {@link SharedBigDataViewerData} object. */ - public static SharedBigDataViewerData createDummyDataFromSpimDataXml( - final String spimDataXmlFilename, - final ViewerOptions viewerOptions, - final RequestRepaint requestRepaint ) throws SpimDataException + public static SharedBigDataViewerData createDummyDataFromSpimDataXml( final String spimDataXmlFilename ) throws SpimDataException { final AbstractSpimData< ? > spimData = DummySpimData.fromSpimDataXml( spimDataXmlFilename ); - return formSpimData( spimDataXmlFilename, spimData, viewerOptions, requestRepaint ); + return fromSpimData( spimDataXmlFilename, spimData ); } - private static SharedBigDataViewerData formSpimData( + private static SharedBigDataViewerData fromSpimData( final String spimDataXmlFilename, - final AbstractSpimData< ? > spimData, - final ViewerOptions viewerOptions, - final RequestRepaint requestRepaint ) + final AbstractSpimData< ? > spimData ) { final AbstractSequenceDescription< ?, ?, ? > seq = spimData.getSequenceDescription(); final int numTimepoints = seq.getTimePoints().size(); @@ -398,9 +385,7 @@ private static SharedBigDataViewerData formSpimData( setups, setupAssignments, cache, - numTimepoints, - viewerOptions, - requestRepaint ); + numTimepoints ); if ( !sbdv.tryLoadSettings( spimDataXmlFilename ) ) { @@ -417,10 +402,7 @@ private static SharedBigDataViewerData formSpimData( * FROM IMAGEPLUS. */ - public static SharedBigDataViewerData fromImagePlus( - final ImagePlus imp, - final ViewerOptions viewerOptions, - final RequestRepaint requestRepaint ) + public static SharedBigDataViewerData fromImagePlus( final ImagePlus imp ) { // check the image type switch ( imp.getType() ) @@ -549,9 +531,7 @@ public static SharedBigDataViewerData fromImagePlus( css, setupAssignments, cache, - numTimepoints, - viewerOptions, - requestRepaint ); + numTimepoints ); // File info final FileInfo fileInfo = imp.getOriginalFileInfo(); diff --git a/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleManager.java b/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleManager.java index 1893419b5..d9dafe76f 100644 --- a/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleManager.java +++ b/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleManager.java @@ -38,7 +38,7 @@ import java.util.Set; import java.util.stream.Collectors; -import org.mastodon.ui.util.FileChooser; +import org.mastodon.io.IOUtils; import org.yaml.snakeyaml.Yaml; import bdv.ui.settings.style.AbstractStyleManager; @@ -155,7 +155,7 @@ public void saveStyles( final String filename ) { try { - FileChooser.mkdirs( filename ); + IOUtils.mkdirs( filename ); final FileWriter output = new FileWriter( filename ); final Yaml yaml = DataDisplayStyleIO.createYaml(); final ArrayList< Object > objects = new ArrayList<>(); diff --git a/src/test/java/org/mastodon/StartMastodonDefaultProject.java b/src/test/java/org/mastodon/StartMastodonDefaultProject.java new file mode 100644 index 000000000..9bdb36d4b --- /dev/null +++ b/src/test/java/org/mastodon/StartMastodonDefaultProject.java @@ -0,0 +1,13 @@ +package org.mastodon; + +public class StartMastodonDefaultProject +{ + + public static void main( final String[] args ) + { + final String projectPath = "samples/MaMuT_Parhyale_small.mastodon"; +// final String projectPath = "/Users/tinevez/Google Drive/Mastodon/Datasets/Remote/ParhyaleHawaiensis/MaMuT_Parhyale_demo-mamut.mastodon"; +// final String projectPath = "samples/drosophila_crop.mastodon"; + StartMastodonOnProject.launch( projectPath ); + } +} diff --git a/src/test/java/org/mastodon/StartMastodonOnProject.java b/src/test/java/org/mastodon/StartMastodonOnProject.java index d2e127509..014345bf0 100644 --- a/src/test/java/org/mastodon/StartMastodonOnProject.java +++ b/src/test/java/org/mastodon/StartMastodonOnProject.java @@ -28,16 +28,20 @@ */ package org.mastodon; +import java.io.IOException; + import javax.swing.JFileChooser; +import javax.swing.SwingUtilities; import javax.swing.WindowConstants; import javax.swing.filechooser.FileNameExtensionFilter; -import mpicbg.spim.data.SpimDataException; + import org.mastodon.mamut.MainWindow; -import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.Context; -import java.io.IOException; +import mpicbg.spim.data.SpimDataException; /** * Starts Mastodon on a given project file. @@ -45,28 +49,34 @@ public class StartMastodonOnProject { - public static void main( String... args ) + public static void main( final String... args ) + { + final String projectPath = fileOpenDialog(); + launch( projectPath ); + } + + public static void launch( final String projectPath ) { - try - { - String projectPath = fileOpenDialog(); - System.setProperty( "apple.laf.useScreenMenuBar", "true" ); - final WindowManager windowManager = new WindowManager( new Context() ); - windowManager.getProjectManager().open( new MamutProjectIO().load( projectPath ) ); - final MainWindow win = new MainWindow( windowManager ); - win.setVisible( true ); - win.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); + SwingUtilities.invokeLater( () -> { - } - catch ( IOException | SpimDataException e ) - { - e.printStackTrace(); - } + try + { + System.setProperty( "apple.laf.useScreenMenuBar", "true" ); + final MamutAppModel appModel = ProjectLoader.open( MamutProjectIO.load( projectPath ), new Context() ); + final MainWindow win = new MainWindow( appModel ); + win.setVisible( true ); + win.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); + } + catch ( IOException | SpimDataException e ) + { + e.printStackTrace(); + } + } ); } private static String fileOpenDialog() { - JFileChooser fileChooser = new JFileChooser( "Open Mastodon Project" ); + final JFileChooser fileChooser = new JFileChooser( "Open Mastodon Project" ); fileChooser.setFileFilter( new FileNameExtensionFilter( "Mastodon Project (*.mastodon)", "mastodon" ) ); fileChooser.showOpenDialog( null ); return fileChooser.getSelectedFile().getAbsolutePath(); diff --git a/src/test/java/org/mastodon/graph/BranchGraphExample.java b/src/test/java/org/mastodon/graph/BranchGraphExample.java index 70ce5e39f..0d34c4029 100644 --- a/src/test/java/org/mastodon/graph/BranchGraphExample.java +++ b/src/test/java/org/mastodon/graph/BranchGraphExample.java @@ -35,7 +35,8 @@ import javax.swing.UnsupportedLookAndFeelException; import org.mastodon.mamut.MainWindow; -import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.Context; @@ -51,12 +52,9 @@ public static void main( final String[] args ) throws IOException final String projectPath = "samples/test_branchgraph.mastodon"; // final String projectPath = "samples/mette_e1.mastodon"; // final String projectPath = "samples/mette_e1_small.mastodon"; - final MamutProject project = new MamutProjectIO().load( projectPath ); - - final WindowManager wm = new WindowManager( context ); - wm.getProjectManager().openWithDialog( project ); - wm.getAppModel().getBranchGraphSync().sync(); - new MainWindow( wm ).setVisible( true ); + final MamutProject project = MamutProjectIO.load( projectPath ); + final MamutAppModel appModel = ProjectLoader.open( project, context ); + new MainWindow( appModel ).setVisible( true ); } catch ( final Exception e1 ) { diff --git a/src/test/java/org/mastodon/mamut/CloseListenerTest.java b/src/test/java/org/mastodon/mamut/CloseListenerTest.java index b00cd3734..310beeee0 100644 --- a/src/test/java/org/mastodon/mamut/CloseListenerTest.java +++ b/src/test/java/org/mastodon/mamut/CloseListenerTest.java @@ -35,6 +35,7 @@ import java.io.IOException; import org.junit.Test; +import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.Context; @@ -45,8 +46,8 @@ public class CloseListenerTest { /** - * Test if {@link CloseListener} is called, when a Mastodon project - * is closed. + * Test if {@link CloseListener} is called, when a Mastodon project is + * closed. */ @Test public void testCloseListeners() throws IOException, SpimDataException @@ -55,23 +56,22 @@ public void testCloseListeners() throws IOException, SpimDataException try (Context context = new Context()) { // setup - WindowManager windowManager = openTinyProject( context ); - MamutAppModel appModel = windowManager.getAppModel(); + final MamutAppModel appModel = openTinyProject( context ); final int[] counter = new int[] { 0 }; appModel.projectClosedListeners().add( () -> counter[ 0 ]++ ); // process - windowManager.setAppModel( null ); // NB: This is the current way to close a Mastodon project. It could maybe use some refactoring. + appModel.close(); + // test assertEquals( 1, counter[ 0 ] ); } } - private static WindowManager openTinyProject( Context context ) throws IOException, SpimDataException + private static MamutAppModel openTinyProject( final Context context ) throws IOException, SpimDataException { - String tinyProjectFile = CloseListenerTest.class.getResource( "/org/mastodon/mamut/examples/tiny/tiny-project.mastodon" ).getFile(); - WindowManager windowManager = new WindowManager( context ); - MamutProject project = new MamutProjectIO().load( tinyProjectFile ); - windowManager.getProjectManager().open( project, false, true ); - return windowManager; + final String tinyProjectFile = CloseListenerTest.class.getResource( "/org/mastodon/mamut/examples/tiny/tiny-project.mastodon" ).getFile(); + final MamutProject project = MamutProjectIO.load( tinyProjectFile ); + final MamutAppModel appModel = ProjectLoader.open( project, context ); + return appModel; } } diff --git a/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java b/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java index 2c9918e3a..82148aea0 100644 --- a/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java +++ b/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java @@ -36,6 +36,7 @@ import java.lang.ref.WeakReference; import org.junit.Test; +import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.ModelGraph; @@ -79,7 +80,7 @@ public void testIfMastodonIsGarbageCollectable() GraphicsEnvironment.isHeadless() ); try( Context context = new Context() ) { - WeakReference< ModelGraph > modelGraph = openAndCloseMastodon( context ); + final WeakReference< ModelGraph > modelGraph = openAndCloseMastodon( context ); GarbageCollectionUtils.triggerGarbageCollection(); assertNull( "The garbage collection failed to clean ModelGraph.", modelGraph.get() ); } @@ -89,16 +90,17 @@ public void testIfMastodonIsGarbageCollectable() * Open a Mastodon project with all different windows and close it. * Return a weak reference to the ModelGraph. */ - static WeakReference< ModelGraph > openAndCloseMastodon( Context context ) + static WeakReference< ModelGraph > openAndCloseMastodon( final Context context ) { try { - WindowManager windowManager = new WindowManager( context ); - MamutProject project = new MamutProjectIO().load( exampleProject ); - windowManager.getProjectManager().open( project, false, true ); - ModelGraph modelGraph = windowManager.getAppModel().getModel().getGraph(); - MainWindow mainWindow = new MainWindow( windowManager ); + final MamutProject project = MamutProjectIO.load( exampleProject ); + final MamutAppModel appModel = ProjectLoader.open( project, context ); + final MainWindow mainWindow = new MainWindow( appModel ); mainWindow.setVisible( true ); + + final ModelGraph modelGraph = appModel.getModel().getGraph(); + final WindowManager windowManager = appModel.getWindowManager(); windowManager.createTrackScheme(); windowManager.createBranchTrackScheme(); windowManager.createHierarchyTrackScheme(); @@ -108,7 +110,7 @@ static WeakReference< ModelGraph > openAndCloseMastodon( Context context ) windowManager.createTable( false ); windowManager.createTable( true ); windowManager.editTagSets(); - mainWindow.close( windowManager, windowManager.getGlobalAppActions().getActionMap().get( ProjectManager.SAVE_PROJECT ), null ); + mainWindow.close(); return new WeakReference<>( modelGraph ); } catch ( IOException | SpimDataException e ) diff --git a/src/main/java/org/mastodon/mamut/feature/MamutPlayground.java b/src/test/java/org/mastodon/mamut/MamutPlayground.java similarity index 89% rename from src/main/java/org/mastodon/mamut/feature/MamutPlayground.java rename to src/test/java/org/mastodon/mamut/MamutPlayground.java index e3827e4bf..ae09ad51a 100644 --- a/src/main/java/org/mastodon/mamut/feature/MamutPlayground.java +++ b/src/test/java/org/mastodon/mamut/MamutPlayground.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.feature; +package org.mastodon.mamut; import java.io.IOException; import java.util.Collection; @@ -38,7 +38,9 @@ import org.mastodon.feature.FeatureProjection; import org.mastodon.feature.FeatureSpec; import org.mastodon.feature.FeatureSpecsService; -import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.feature.MamutFeatureComputerService; +import org.mastodon.mamut.feature.SpotCenterIntensityFeature; +import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Link; @@ -54,17 +56,16 @@ public class MamutPlayground public static void main( final String[] args ) throws IOException, SpimDataException { final Context context = new Context(); - final MamutProject project = new MamutProjectIO().load( "../TrackMate3/samples/mamutproject.mastodon" ); - final WindowManager windowManager = new WindowManager( context ); - windowManager.getProjectManager().openWithDialog( project ); - final Model model = windowManager.getAppModel().getModel(); + final MamutProject project = MamutProjectIO.load( "samples/mamutproject.mastodon" ); + final MamutAppModel appModel = ProjectLoader.open( project, context ); + final Model model = appModel.getModel(); System.out.println( "\n\n\n___________________________________\nData loaded.\n" ); final MamutFeatureComputerService featureComputerService = MamutFeatureComputerService.newInstance( context ); featureComputerService.setModel( model ); - featureComputerService.setSharedBdvData( windowManager.getAppModel().getSharedBdvData() ); + featureComputerService.setSharedBdvData( appModel.getSharedBdvData() ); final Map< FeatureSpec< ?, ? >, Feature< ? > > features = featureComputerService.compute( SpotCenterIntensityFeature.SPEC ); diff --git a/src/test/java/org/mastodon/mamut/ProjectManagerTest.java b/src/test/java/org/mastodon/mamut/ProjectManagerTest.java index 9e125129a..96632349e 100644 --- a/src/test/java/org/mastodon/mamut/ProjectManagerTest.java +++ b/src/test/java/org/mastodon/mamut/ProjectManagerTest.java @@ -39,12 +39,15 @@ import java.nio.file.Paths; import java.util.zip.ZipFile; -import mpicbg.spim.data.SpimDataException; import org.junit.Test; +import org.mastodon.mamut.io.ProjectLoader; +import org.mastodon.mamut.io.ProjectSaver; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.Context; +import mpicbg.spim.data.SpimDataException; + /** * Tests {@link ProjectManager}. * @@ -62,7 +65,7 @@ public class ProjectManagerTest public void testSaveDatasetXmlBackup() throws IOException, SpimDataException { assumeFalse( GraphicsEnvironment.isHeadless() ); - Path outputProject = Files.createTempFile( "test", ".mastodon" ); + final Path outputProject = Files.createTempFile( "test", ".mastodon" ); openAndSaveMastodonProject( tinyExampleProject, outputProject ); assertProjectContainsBackupDatasetXml( outputProject ); } @@ -73,51 +76,50 @@ public void testSaveDatasetXmlBackupUnderManyConditions() throws IOException, Sp { assumeFalse( GraphicsEnvironment.isHeadless() ); // The following use case is tested. - Path projectA = Files.createTempFile( "test", ".mastodon" ); + final Path projectA = Files.createTempFile( "test", ".mastodon" ); // 1. Open mastodon project and save it openAndSaveMastodonProject( tinyExampleProject, projectA ); assertProjectContainsBackupDatasetXml( projectA ); // 2. Move mastodon project to new location, relative path to dataset.xml gets lost - Path newLocation = Files.createTempDirectory( "mastodon-test" ); - Path projectB = newLocation.resolve( "moved-project.mastodon" ); + final Path newLocation = Files.createTempDirectory( "mastodon-test" ); + final Path projectB = newLocation.resolve( "moved-project.mastodon" ); Files.move( projectA, projectB ); assertProjectContainsBackupDatasetXml( projectB ); // 3. Save mastodon project inplace openAndSaveMastodonProject( projectB, projectB ); assertProjectContainsBackupDatasetXml( projectB ); // 4. Save mastodon project (not inplace) - Path projectC = newLocation.resolve( "moved-project.mastodon" ); + final Path projectC = newLocation.resolve( "moved-project.mastodon" ); openAndSaveMastodonProject( projectB, projectC ); assertProjectContainsBackupDatasetXml( projectC ); } - private void openAndSaveMastodonProject( Path open, Path save ) + private void openAndSaveMastodonProject( final Path open, final Path save ) throws IOException, SpimDataException { - WindowManager windowManager = new WindowManager( context ); - MamutProject project = new MamutProjectIO().load( open.toFile().getAbsolutePath() ); - windowManager.getProjectManager().open( project, false, true ); - windowManager.getProjectManager().saveProject( save.toFile() ); + final MamutProject project = MamutProjectIO.load( open.toFile().getAbsolutePath() ); + final MamutAppModel appModel = ProjectLoader.open( project, context, false, true ); + ProjectSaver.saveProject( save.toFile(), appModel ); } - private void assertProjectContainsBackupDatasetXml( Path project ) + private void assertProjectContainsBackupDatasetXml( final Path project ) throws IOException { try (ZipFile zipFile = new ZipFile( project.toFile() )) { - boolean containsBackupXml = zipFile.stream() + final boolean containsBackupXml = zipFile.stream() .anyMatch( entry -> "dataset.xml.backup".equals( entry.getName() ) ); assertTrue( containsBackupXml ); } } - private Path resourceAsFile( String resourceName ) + private Path resourceAsFile( final String resourceName ) { try { return Paths.get( ProjectManagerTest.class.getResource( resourceName ).toURI() ); } - catch ( URISyntaxException e ) + catch ( final URISyntaxException e ) { throw new RuntimeException( e ); } diff --git a/src/test/java/org/mastodon/mamut/StartMastodonWithMissingImageDemo.java b/src/test/java/org/mastodon/mamut/StartMastodonWithMissingImageDemo.java index c592c7ff9..bebd06cca 100644 --- a/src/test/java/org/mastodon/mamut/StartMastodonWithMissingImageDemo.java +++ b/src/test/java/org/mastodon/mamut/StartMastodonWithMissingImageDemo.java @@ -33,6 +33,7 @@ import javax.swing.JLabel; import javax.swing.WindowConstants; +import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.Context; @@ -73,9 +74,8 @@ private void openProjectFromResources( final String resourceName ) try { System.setProperty( "apple.laf.useScreenMenuBar", "true" ); - final WindowManager windowManager = new WindowManager( new Context() ); - windowManager.getProjectManager().openWithDialog( new MamutProjectIO().load( file ) ); - final MainWindow win = new MainWindow( windowManager ); + final MamutAppModel appModel = ProjectLoader.open( MamutProjectIO.load( file ), new Context() ); + final MainWindow win = new MainWindow( appModel ); win.setVisible( true ); } diff --git a/src/test/java/org/mastodon/mamut/feature/RawDeserializationExample.java b/src/test/java/org/mastodon/mamut/feature/RawDeserializationExample.java index 232cb6fd3..d30bf4343 100644 --- a/src/test/java/org/mastodon/mamut/feature/RawDeserializationExample.java +++ b/src/test/java/org/mastodon/mamut/feature/RawDeserializationExample.java @@ -43,7 +43,9 @@ import org.mastodon.feature.Feature; import org.mastodon.feature.FeatureModel; import org.mastodon.feature.FeatureSpec; -import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.io.ProjectLoader; +import org.mastodon.mamut.io.ProjectSaver; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; @@ -62,17 +64,16 @@ public static void main( final String[] args ) throws ClassNotFoundException, In UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() ); // Load project. - final WindowManager windowManager = new WindowManager( new Context() ); - final MamutProject project = new MamutProjectIO().load( "samples/mamutproject.mastodon" ); - windowManager.getProjectManager().open( project ); - final Model model = windowManager.getAppModel().getModel(); + final MamutProject project = MamutProjectIO.load( "samples/mamutproject.mastodon" ); + final MamutAppModel appModel = ProjectLoader.open( project, new Context() ); + final Model model = appModel.getModel(); final FeatureModel featureModel = model.getFeatureModel(); // Compute features. final MamutFeatureComputerService featureComputerService = - MamutFeatureComputerService.newInstance( windowManager.getContext() ); + MamutFeatureComputerService.newInstance( appModel.getContext() ); featureComputerService.setModel( model ); - featureComputerService.setSharedBdvData( windowManager.getAppModel().getSharedBdvData() ); + featureComputerService.setSharedBdvData( appModel.getSharedBdvData() ); System.out.println( "\nComputing features..." ); final StopWatch stopWatch = StopWatch.createAndStart(); final Map< FeatureSpec< ?, ? >, Feature< ? > > features = @@ -85,7 +86,7 @@ public static void main( final String[] args ) throws ClassNotFoundException, In final File targetFile = new File( "samples/featureserialized-folder" ); targetFile.mkdir(); System.out.println( "\nResaving in a project folder." ); - windowManager.getProjectManager().saveProject( targetFile ); + ProjectSaver.saveProject( targetFile, appModel ); System.out.println( "Done." ); System.out.println( "----------------------------------\n\n" ); diff --git a/src/test/java/org/mastodon/mamut/feature/SerializeFeatureExample.java b/src/test/java/org/mastodon/mamut/feature/SerializeFeatureExample.java index 26b520341..8a2b32fbd 100644 --- a/src/test/java/org/mastodon/mamut/feature/SerializeFeatureExample.java +++ b/src/test/java/org/mastodon/mamut/feature/SerializeFeatureExample.java @@ -39,7 +39,9 @@ import org.mastodon.feature.Feature; import org.mastodon.feature.FeatureModel; import org.mastodon.feature.FeatureSpec; -import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.io.ProjectLoader; +import org.mastodon.mamut.io.ProjectSaver; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; @@ -59,17 +61,16 @@ public static void main( final String[] args ) throws ClassNotFoundException, In UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() ); // Load project. - final WindowManager windowManager = new WindowManager( new Context() ); - final MamutProject project = new MamutProjectIO().load( "samples/mamutproject.mastodon" ); - windowManager.getProjectManager().open( project ); - final Model model = windowManager.getAppModel().getModel(); + final MamutProject project = MamutProjectIO.load( "samples/mamutproject.mastodon" ); + final MamutAppModel appModel = ProjectLoader.open( project, new Context() ); + final Model model = appModel.getModel(); final FeatureModel featureModel = model.getFeatureModel(); // Compute features. final MamutFeatureComputerService featureComputerService = - MamutFeatureComputerService.newInstance( windowManager.getContext() ); + MamutFeatureComputerService.newInstance( appModel.getContext() ); featureComputerService.setModel( model ); - featureComputerService.setSharedBdvData( windowManager.getAppModel().getSharedBdvData() ); + featureComputerService.setSharedBdvData( appModel.getSharedBdvData() ); System.out.println( "\nComputing features..." ); final StopWatch stopWatch = StopWatch.createAndStart(); final Map< FeatureSpec< ?, ? >, Feature< ? > > features = @@ -82,13 +83,14 @@ public static void main( final String[] args ) throws ClassNotFoundException, In final File targetFile = new File( "samples/featureserialized.mastodon" ); System.out.println( "\nResaving." ); - windowManager.getProjectManager().saveProject( targetFile ); + ProjectSaver.saveProject( targetFile, appModel ); System.out.println( "Done." ); System.out.println( "\nReloading." ); - windowManager.getProjectManager().open( new MamutProjectIO().load( targetFile.getAbsolutePath() ) ); + final MamutProject project2 = MamutProjectIO.load( targetFile.getAbsolutePath() ); + final MamutAppModel appModel2 = ProjectLoader.open( project2, appModel.getContext() ); System.out.println( "Done." ); - System.out.println( "\n" + ModelUtils.dump( windowManager.getAppModel().getModel(), 4 ) ); + System.out.println( "\n" + ModelUtils.dump( appModel2.getModel(), 4 ) ); } } diff --git a/src/test/java/org/mastodon/mamut/feature/SpotIntensityBenchmark.java b/src/test/java/org/mastodon/mamut/feature/SpotIntensityBenchmark.java index 1e0238ce0..b94702a4f 100644 --- a/src/test/java/org/mastodon/mamut/feature/SpotIntensityBenchmark.java +++ b/src/test/java/org/mastodon/mamut/feature/SpotIntensityBenchmark.java @@ -31,7 +31,8 @@ import java.io.IOException; import org.jdom2.JDOMException; -import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; @@ -50,17 +51,15 @@ public static void main( final String[] args ) throws IOException, JDOMException * 1. Load a regular Mastodon project. */ - final MamutProject project = new MamutProjectIO() - .load( "/Users/tinevez/Projects/JYTinevez/MaMuT/Mastodon-dataset/MaMuT_Parhyale_demo.mastodon" ); - final WindowManager windowManager = new WindowManager( new Context() ); - windowManager.getProjectManager().open( project ); - final Model model = windowManager.getAppModel().getModel(); + final MamutProject project = MamutProjectIO.load( "/Users/tinevez/Projects/JYTinevez/MaMuT/Mastodon-dataset/MaMuT_Parhyale_demo.mastodon" ); + final MamutAppModel appModel = ProjectLoader.open( project, new Context() ); + final Model model = appModel.getModel(); // Just keep the 1st time-point, or else.... System.out.println( "Removing all time-points but the first one." ); model.getSpatioTemporalIndex().getSpatialIndex( 0 ); - final int minTimepoint = windowManager.getAppModel().getMinTimepoint(); - final int maxTimepoint = windowManager.getAppModel().getMaxTimepoint(); + final int minTimepoint = appModel.getMinTimepoint(); + final int maxTimepoint = appModel.getMaxTimepoint(); for ( int t = minTimepoint + 1; t < maxTimepoint; t++ ) { for ( final Spot spot : model.getSpatioTemporalIndex().getSpatialIndex( t ) ) @@ -72,16 +71,16 @@ public static void main( final String[] args ) throws IOException, JDOMException * 1.1a. Compute spot intensity feature for all. */ - final Context context = windowManager.getContext(); + final Context context = appModel.getContext(); final MamutFeatureComputerService featureComputerService = MamutFeatureComputerService.newInstance( context ); featureComputerService.setModel( model ); - featureComputerService.setSharedBdvData( windowManager.getAppModel().getSharedBdvData() ); + featureComputerService.setSharedBdvData( appModel.getSharedBdvData() ); System.out.println( "Computing spot intensity..." ); for ( int i = 0; i < 5; i++ ) { final StopWatch stopWatch = StopWatch.createAndStart(); - featureComputerService.compute( SpotCenterIntensityFeature.SPEC ); + featureComputerService.compute( true, SpotCenterIntensityFeature.SPEC ); stopWatch.stop(); System.out.println( String.format( "Done in %.2f s.", stopWatch.nanoTime() / 1e9 ) ); } diff --git a/src/test/java/org/mastodon/mamut/feature/SpotIntensityUpdateExample.java b/src/test/java/org/mastodon/mamut/feature/SpotIntensityUpdateExample.java index e5912112e..048051bb2 100644 --- a/src/test/java/org/mastodon/mamut/feature/SpotIntensityUpdateExample.java +++ b/src/test/java/org/mastodon/mamut/feature/SpotIntensityUpdateExample.java @@ -38,7 +38,8 @@ import org.mastodon.feature.FeatureModel; import org.mastodon.feature.FeatureProjection; import org.mastodon.feature.FeatureSpec; -import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; @@ -57,10 +58,9 @@ public static void main( final String[] args ) throws IOException, JDOMException * 1. Load a regular Mastodon project. */ - final MamutProject project = new MamutProjectIO().load( "samples/mamutproject.mastodon" ); - final WindowManager windowManager = new WindowManager( new Context() ); - windowManager.getProjectManager().open( project ); - final Model model = windowManager.getAppModel().getModel(); + final MamutProject project = MamutProjectIO.load( "samples/mamutproject.mastodon" ); + final MamutAppModel appModel = ProjectLoader.open( project, new Context() ); + final Model model = appModel.getModel(); final FeatureModel featureModel = model.getFeatureModel(); // Keep a spot for later @@ -70,11 +70,11 @@ public static void main( final String[] args ) throws IOException, JDOMException * 1.1a. Compute spot intensity feature for all. */ - final Context context = windowManager.getContext(); + final Context context = appModel.getContext(); final MamutFeatureComputerService featureComputerService = MamutFeatureComputerService.newInstance( context ); featureComputerService.setModel( model ); - featureComputerService.setSharedBdvData( windowManager.getAppModel().getSharedBdvData() ); + featureComputerService.setSharedBdvData( appModel.getSharedBdvData() ); System.out.println( "Computing spot intensity..." ); final StopWatch stopWatch = StopWatch.createAndStart(); final Map< FeatureSpec< ?, ? >, Feature< ? > > features = featureComputerService.compute( diff --git a/src/test/java/org/mastodon/mamut/feature/ui/FeatureColorModeConfigPageDemo.java b/src/test/java/org/mastodon/mamut/feature/ui/FeatureColorModeConfigPageDemo.java index ce3b3ead4..ce04015f5 100644 --- a/src/test/java/org/mastodon/mamut/feature/ui/FeatureColorModeConfigPageDemo.java +++ b/src/test/java/org/mastodon/mamut/feature/ui/FeatureColorModeConfigPageDemo.java @@ -68,7 +68,7 @@ public static void main( final String[] args ) throws Exception featureProjectionsManager, "Spot", "Link" ) ); - final MamutProject project = new MamutProjectIO().load( "samples/drosophila_crop.mastodon" ); + final MamutProject project = MamutProjectIO.load( "samples/drosophila_crop.mastodon" ); final Model model = new Model(); model.loadRaw( project.openForReading() ); featureProjectionsManager.setModel( model, 3 ); diff --git a/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java b/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java index 88f5497db..813b46102 100644 --- a/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java +++ b/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java @@ -39,11 +39,12 @@ import org.mastodon.feature.FeatureModel; import org.mastodon.feature.FeatureProjection; import org.mastodon.feature.FeatureSpec; -import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.MamutAppModel; import org.mastodon.mamut.feature.MamutFeatureComputerService; import org.mastodon.mamut.feature.TrackSizeFeature; import org.mastodon.mamut.importer.trackmate.MamutExporter; import org.mastodon.mamut.importer.trackmate.TrackMateImporter; +import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; @@ -61,22 +62,21 @@ public static void main( final String[] args ) throws IOException, JDOMException * 1. Load a regular Mastodon project. */ - final MamutProject project = new MamutProjectIO().load( "samples/mamutproject.mastodon" ); - final WindowManager windowManager = new WindowManager( new Context() ); - windowManager.getProjectManager().open( project ); - final Model model = windowManager.getAppModel().getModel(); + final MamutProject project = MamutProjectIO.load( "samples/mamutproject.mastodon" ); + final MamutAppModel appModel = ProjectLoader.open( project, new Context() ); + final Model model = appModel.getModel(); final FeatureModel featureModel = model.getFeatureModel(); /* * 1.1a. Compute all features. */ - final Context context = windowManager.getContext(); + final Context context = appModel.getContext(); final MamutFeatureComputerService featureComputerService = MamutFeatureComputerService.newInstance( context ); final Collection< FeatureSpec< ?, ? > > featureKeys = featureComputerService.getFeatureSpecs(); featureComputerService.setModel( model ); - featureComputerService.setSharedBdvData( windowManager.getAppModel().getSharedBdvData() ); + featureComputerService.setSharedBdvData( appModel.getSharedBdvData() ); System.out.println( "Computing all discovered features: " + featureKeys ); final Map< FeatureSpec< ?, ? >, Feature< ? > > features = featureComputerService.compute( featureKeys ); System.out.println( "Done." ); @@ -132,7 +132,7 @@ public static void main( final String[] args ) throws IOException, JDOMException */ featureComputerService.setModel( importedModel ); - featureComputerService.setSharedBdvData( windowManager.getAppModel().getSharedBdvData() ); + featureComputerService.setSharedBdvData( appModel.getSharedBdvData() ); System.out.println( "Computing feature: " + TrackSizeFeature.SPEC ); final Map< FeatureSpec< ?, ? >, Feature< ? > > features2 = featureComputerService.compute( Collections.singleton( TrackSizeFeature.SPEC ) ); diff --git a/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java b/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java index 2ae185680..57e9bac3d 100644 --- a/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java +++ b/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java @@ -36,8 +36,10 @@ import javax.swing.UnsupportedLookAndFeelException; import org.mastodon.feature.FeatureSpecsService; -import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.MamutAppModel; import org.mastodon.mamut.importer.trackmate.TrackMateImporter; +import org.mastodon.mamut.io.ProjectLoader; +import org.mastodon.mamut.io.ProjectSaver; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelUtils; @@ -49,13 +51,13 @@ public class MaMuTImporterExample { public static void main( final String[] args ) throws ClassNotFoundException, InstantiationException, - IllegalAccessException, UnsupportedLookAndFeelException + IllegalAccessException, UnsupportedLookAndFeelException, IOException, SpimDataException { Locale.setDefault( Locale.ROOT ); UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() ); - final File mamutFile = new File( "D:/Projects/JYTinevez/MaMuT/Mastodon-dataset/MaMuT_Parhyale_demo-mamut.xml" ); - // final File mamutFile = new File( "/Users/tinevez/Projects/JYTinevez/MaMuT/Mastodon-dataset/MaMuT_Parhyale_demo-mamut.xml" ); +// final File mamutFile = new File( "D:/Projects/JYTinevez/MaMuT/Mastodon-dataset/MaMuT_Parhyale_demo-mamut.xml" ); + final File mamutFile = new File( "/Users/tinevez/Projects/JYTinevez/MaMuT/Mastodon-dataset/MaMuT_Parhyale_demo-mamut.xml" ); final File targetMastodonFile = new File( "samples/trackmateimported.mastodon" ); importFromMaMuTAndSave( mamutFile, targetMastodonFile ); @@ -63,45 +65,21 @@ public static void main( final String[] args ) throws ClassNotFoundException, In reloadAfterSave( targetMastodonFile ); } - private static void importFromMaMuTAndSave( final File mamutFile, final File targetMastodonFile ) + private static void importFromMaMuTAndSave( final File mamutFile, final File targetMastodonFile ) throws IOException, SpimDataException { final Context context = new Context(); - final WindowManager windowManager = new WindowManager( context ); - try - { - final TrackMateImporter importer = new TrackMateImporter( mamutFile ); - windowManager.getProjectManager().open( importer.createProject() ); - final FeatureSpecsService featureSpecsService = context.getService( FeatureSpecsService.class ); - importer.readModel( windowManager.getAppModel().getModel(), featureSpecsService ); - } - catch ( final IOException | SpimDataException e ) - { - e.printStackTrace(); - } - - try - { - windowManager.getProjectManager().saveProject( targetMastodonFile ); - } - catch ( final IOException e ) - { - e.printStackTrace(); - } + final TrackMateImporter importer = new TrackMateImporter( mamutFile ); + final MamutAppModel appModel = ProjectLoader.open( importer.createProject(), context ); + final FeatureSpecsService featureSpecsService = context.getService( FeatureSpecsService.class ); + importer.readModel( appModel.getModel(), featureSpecsService ); + ProjectSaver.saveProject( targetMastodonFile, appModel ); } - private static void reloadAfterSave( final File targetMastodonFile ) + private static void reloadAfterSave( final File targetMastodonFile ) throws IOException, SpimDataException { - final WindowManager windowManager = new WindowManager( new Context() ); - try - { - windowManager.getProjectManager().open( new MamutProjectIO().load( targetMastodonFile.getAbsolutePath() ) ); - final Model model = windowManager.getAppModel().getModel(); - System.out.println( "After reloading the saved MaMuT import:" ); - System.out.println( ModelUtils.dump( model, 5 ) ); - } - catch ( final IOException | SpimDataException e ) - { - e.printStackTrace(); - } + final MamutAppModel appModel = ProjectLoader.open( MamutProjectIO.load( targetMastodonFile.getAbsolutePath() ), new Context() ); + final Model model = appModel.getModel(); + System.out.println( "After reloading the saved MaMuT import:" ); + System.out.println( ModelUtils.dump( model, 5 ) ); } } diff --git a/src/test/java/org/mastodon/mamut/importer/trackmate/MaMuTExporterTest.java b/src/test/java/org/mastodon/mamut/importer/trackmate/MaMuTExporterTest.java index 8ea178d0a..a5ccb5b18 100644 --- a/src/test/java/org/mastodon/mamut/importer/trackmate/MaMuTExporterTest.java +++ b/src/test/java/org/mastodon/mamut/importer/trackmate/MaMuTExporterTest.java @@ -72,7 +72,6 @@ import org.scijava.Context; import bdv.tools.bookmarks.Bookmarks; -import bdv.viewer.ViewerOptions; import fiji.plugin.mamut.SourceSettings; import fiji.plugin.mamut.io.MamutXmlReader; import mpicbg.spim.data.SpimDataException; @@ -330,11 +329,11 @@ private Model export() throws IOException, SpimDataException */ final Context context = new Context(); - final MamutProject project = new MamutProjectIO().load( MASTODON_FILE ); + final MamutProject project = MamutProjectIO.load( MASTODON_FILE ); final String spimDataXmlFilename = project.getDatasetXmlFile().getAbsolutePath(); final SharedBigDataViewerData sharedBdvData = - SharedBigDataViewerData.fromSpimDataXmlFile( spimDataXmlFilename, new ViewerOptions(), () -> {} ); + SharedBigDataViewerData.fromSpimDataXmlFile( spimDataXmlFilename ); final Model model = new Model( project.getSpaceUnits(), project.getTimeUnits() ); loadProject( context, project, model ); diff --git a/src/test/java/org/mastodon/mamut/project/MamutProjectIOTest.java b/src/test/java/org/mastodon/mamut/project/MamutProjectIOTest.java index 8fe351047..2b2119821 100644 --- a/src/test/java/org/mastodon/mamut/project/MamutProjectIOTest.java +++ b/src/test/java/org/mastodon/mamut/project/MamutProjectIOTest.java @@ -46,16 +46,16 @@ public void testProjectWithWindowsPath() throws IOException } @Test - public void testPorjectWithLinuxPath() throws IOException + public void testProjectWithLinuxPath() throws IOException { testCanFindDatasetXmlFile( "/org/mastodon/mamut/examples/tiny-os/tiny-project-linux.mastodon" ); } - private void testCanFindDatasetXmlFile( String resource ) throws IOException + private void testCanFindDatasetXmlFile( final String resource ) throws IOException { final String projectFile = MamutProjectIOTest.class.getResource( resource ).getPath(); - MamutProject project = new MamutProjectIO().load( projectFile ); - File datasetXmlFile = project.getDatasetXmlFile(); + final MamutProject project = MamutProjectIO.load( projectFile ); + final File datasetXmlFile = project.getDatasetXmlFile(); assertTrue( datasetXmlFile.exists() ); } } diff --git a/src/test/java/org/mastodon/mamut/tags/PlayingWithTagsExample.java b/src/test/java/org/mastodon/mamut/tags/PlayingWithTagsExample.java index 5d0bcbe95..ce9727a7a 100644 --- a/src/test/java/org/mastodon/mamut/tags/PlayingWithTagsExample.java +++ b/src/test/java/org/mastodon/mamut/tags/PlayingWithTagsExample.java @@ -3,7 +3,8 @@ import java.io.IOException; import java.util.Collection; -import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; @@ -22,10 +23,8 @@ public class PlayingWithTagsExample public static void main( final String[] args ) throws IOException, SpimDataException { - final WindowManager wm = new WindowManager( new Context() ); - wm.getProjectManager().open( new MamutProjectIO().load( "/Users/tinevez/Development/MastodonWS/mastodon/samples/drosophila_crop.mastodon" ) ); - - final Model model = wm.getAppModel().getModel(); + final MamutAppModel appModel = ProjectLoader.open( MamutProjectIO.load( "/Users/tinevez/Development/MastodonWS/mastodon/samples/drosophila_crop.mastodon" ), new Context() ); + final Model model = appModel.getModel(); final TagSetModel< Spot, Link > tsm = model.getTagSetModel(); /* diff --git a/src/test/java/org/mastodon/util/GarbageCollectionUtils.java b/src/test/java/org/mastodon/util/GarbageCollectionUtils.java index db8b1ded9..3f76e818a 100644 --- a/src/test/java/org/mastodon/util/GarbageCollectionUtils.java +++ b/src/test/java/org/mastodon/util/GarbageCollectionUtils.java @@ -39,7 +39,8 @@ public class GarbageCollectionUtils { - private GarbageCollectionUtils() { + private GarbageCollectionUtils() + { // prevent from instantiation } @@ -65,19 +66,19 @@ private static void triggerGarbageCollectionOnce() // (This will trigger GC.) try { - List< byte[] > memory = new ArrayList<>(); + final List< byte[] > memory = new ArrayList<>(); while ( true ) memory.add( new byte[ 100 * 1024 * 1024 ] ); // add 100MB } - catch ( OutOfMemoryError e ) + catch ( final OutOfMemoryError e ) { // continue } } /** - * The Swing UI framework easily causes memory leaks. - * This is a workaround for one those memory leaks. + * The Swing UI framework easily causes memory leaks. This is a workaround + * for one those memory leaks. *

* The BufferStrategyPaintManager would keep a reference to the latest * painted window. So in order to allow other windows to be garbage @@ -87,9 +88,12 @@ private static void triggerGarbageCollectionOnce() */ private static void workAroundSwingMemoryLeak() { - JFrame dummy = new JFrame() { + final JFrame dummy = new JFrame() + { + private static final long serialVersionUID = 1L; + @Override - public void paint( Graphics g ) + public void paint( final Graphics g ) { super.paint( g ); SwingUtilities.invokeLater( this::dispose ); diff --git a/src/test/java/org/mastodon/util/MastodonUtils.java b/src/test/java/org/mastodon/util/MastodonUtils.java index 857088a99..b0f16f42b 100644 --- a/src/test/java/org/mastodon/util/MastodonUtils.java +++ b/src/test/java/org/mastodon/util/MastodonUtils.java @@ -38,6 +38,7 @@ import org.mastodon.mamut.MamutAppModel; import org.mastodon.mamut.WindowManager; import org.mastodon.mamut.feature.MamutRawFeatureModelIO; +import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Link; @@ -58,22 +59,23 @@ public class MastodonUtils private static final boolean LOG_STACK_TRACE = false; - private MastodonUtils() { + private MastodonUtils() + { // prevent from instantiation } - static Model openMastodonModel( Context context, String projectPath ) + static Model openMastodonModel( final Context context, final String projectPath ) { try { - MamutProject project = new MamutProjectIO().load( projectPath ); + final MamutProject project = MamutProjectIO.load( projectPath ); final Model model = new Model( project.getSpaceUnits(), project.getTimeUnits() ); final boolean isNewProject = project.getProjectRoot() == null; if ( !isNewProject ) { try (final MamutProject.ProjectReader reader = project.openForReading()) { - final RawGraphIO.FileIdToGraphMap idmap = model.loadRaw( reader ); + final RawGraphIO.FileIdToGraphMap< Spot, Link > idmap = model.loadRaw( reader ); // Load features. MamutRawFeatureModelIO.deserialize( context, model, idmap, reader ); } @@ -84,83 +86,86 @@ static Model openMastodonModel( Context context, String projectPath ) } return model; } - catch ( IOException e ) + catch ( final IOException e ) { throw new RuntimeException( e ); } } - public static WindowManager showGui(String projectPath) { - try { - final WindowManager windowManager = new WindowManager( new Context() ); - windowManager.getProjectManager().open( new MamutProjectIO().load( projectPath ) ); - final MainWindow mainWindow = new MainWindow(windowManager); + public static WindowManager showGui( final String projectPath ) + { + try + { + final MamutAppModel appModel = ProjectLoader.open( MamutProjectIO.load( projectPath ), new Context() ); + final MainWindow mainWindow = new MainWindow( appModel ); mainWindow.setVisible( true ); mainWindow.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); - return windowManager; - } catch (IOException | SpimDataException e) { - throw new RuntimeException(e); + return appModel.getWindowManager(); + } + catch ( IOException | SpimDataException e ) + { + throw new RuntimeException( e ); } } - public static void logMastodonEvents( MamutAppModel appModel ) + public static void logMastodonEvents( final MamutAppModel appModel ) { - GroupHandle groupHandle = appModel.getGroupManager().createGroupHandle(); + final GroupHandle groupHandle = appModel.getGroupManager().createGroupHandle(); groupHandle.setGroupId( 0 ); logNavigationHandle( groupHandle.getModel( appModel.NAVIGATION ) ); - logTimePointModel(groupHandle.getModel( appModel.TIMEPOINT ) ); - logFocusModel(appModel); - logTagSetModel(appModel); + logTimePointModel( groupHandle.getModel( appModel.TIMEPOINT ) ); + logFocusModel( appModel ); + logTagSetModel( appModel ); } - private static void logFocusModel( MamutAppModel appModel ) + private static void logFocusModel( final MamutAppModel appModel ) { - FocusModel focusModel = appModel.getFocusModel(); - ModelGraph graph = appModel.getModel().getGraph(); - focusModel.listeners().add(() -> { - Spot ref = graph.vertexRef(); - Spot focusedSpot = focusModel.getFocusedVertex( ref ); + final FocusModel< Spot, Link > focusModel = appModel.getFocusModel(); + final ModelGraph graph = appModel.getModel().getGraph(); + focusModel.listeners().add( () -> { + final Spot ref = graph.vertexRef(); + final Spot focusedSpot = focusModel.getFocusedVertex( ref ); log( "FocusModel: focused vertex: " + focusedSpot ); graph.releaseRef( ref ); - }); + } ); } - private static void logNavigationHandle( NavigationHandler navigationHandler ) + private static void logNavigationHandle( final NavigationHandler< Spot, Link > navigationHandler ) { - navigationHandler.listeners().add( new NavigationListener() + navigationHandler.listeners().add( new NavigationListener< Spot, Link >() { @Override - public void navigateToVertex( Spot vertex ) + public void navigateToVertex( final Spot vertex ) { log( "NavigationHandler: navigate to vertex " + vertex ); } @Override - public void navigateToEdge( Link edge ) + public void navigateToEdge( final Link edge ) { log( "NavigationHandler: navigate to edge " + edge ); } } ); } - private static void logTimePointModel( TimepointModel model ) + private static void logTimePointModel( final TimepointModel model ) { model.listeners().add( () -> log( "Time point changed: (to " + model.getTimepoint() + ")" ) ); } - private static void logTagSetModel( MamutAppModel appModel ) + private static void logTagSetModel( final MamutAppModel appModel ) { // TODO - Model model = appModel.getModel(); - TagSetModel tagSetModel = model.getTagSetModel(); + final Model model = appModel.getModel(); + final TagSetModel< Spot, Link > tagSetModel = model.getTagSetModel(); tagSetModel.listeners().add( () -> log( "tag set changed" ) ); } - private static void log( String text ) + private static void log( final String text ) { System.out.println( text + " " + Thread.currentThread().getName() ); - if( LOG_STACK_TRACE ) - for ( StackTraceElement stackTraceElement : Thread.currentThread().getStackTrace() ) + if ( LOG_STACK_TRACE ) + for ( final StackTraceElement stackTraceElement : Thread.currentThread().getStackTrace() ) System.out.println( " " + stackTraceElement ); } } From 58ffc9742484095320dda757154635477d3a2838 Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Wed, 16 Aug 2023 20:55:39 +0200 Subject: [PATCH 006/220] Rename appActions and globalAppActions. Also make more explicit their respective role in the javadoc. --- .../org/mastodon/app/MastodonAppModel.java | 37 +++++++++---------- .../mastodon/app/ui/MastodonFrameView.java | 14 +++---- .../java/org/mastodon/mamut/MainWindow.java | 28 +++++++------- .../org/mastodon/mamut/MamutAppModel.java | 12 +++--- .../org/mastodon/mamut/MamutBranchView.java | 14 +++---- .../org/mastodon/mamut/WindowManager.java | 37 ++++++++++--------- 6 files changed, 72 insertions(+), 70 deletions(-) diff --git a/src/main/java/org/mastodon/app/MastodonAppModel.java b/src/main/java/org/mastodon/app/MastodonAppModel.java index 4eae0006b..1eddf1319 100644 --- a/src/main/java/org/mastodon/app/MastodonAppModel.java +++ b/src/main/java/org/mastodon/app/MastodonAppModel.java @@ -96,13 +96,13 @@ public class MastodonAppModel< /** * Actions that should be available in all views. */ - private final Actions appActions; + private final Actions modelActions; /** * Actions that are always available, even if no {@link MastodonAppModel} * currently exists. */ - private final Actions globalActions; + private final Actions projectActions; /** * Instantiate a new Mastodon-app model. @@ -134,7 +134,7 @@ public MastodonAppModel( { this.model = model; this.plugins = plugins; - this.globalActions = globalActions; + this.projectActions = globalActions; final ListenableReadOnlyGraph< V, E > graph = model.getGraph(); final GraphIdBimap< V, E > idmap = model.getGraphIdBimap(); @@ -160,7 +160,7 @@ public MastodonAppModel( this.keyConfigContexts = keyConfigContexts; final InputTriggerConfig keyconf = keymapManager.getForwardDefaultKeymap().getConfig(); - this.appActions = new Actions( keyconf, keyConfigContexts ); + this.modelActions = new Actions( keyconf, keyConfigContexts ); } public M getModel() @@ -214,29 +214,28 @@ public KeymapManager getKeymapManager() } /** - * Actions that should be available in all views. - * + * Actions that operates on the whole data model and are available in all + * views of the data. + *

+ * For instance undo/redo, select all, etc. * - * @return the application actions. + * @return the model actions. */ - public Actions getAppActions() + public Actions getModelActions() { - return appActions; + return modelActions; } /** - * Actions that are always available, even if no {@link MastodonAppModel} - * currently exists. - * - * TODO: naming, this should be named appActions and the AppModel.appActions - * should become modelActions? - * - * TODO: or rename AppModel --> ProjectModel, then projectActions? + * Actions that operates on the app or whole project. + *

+ * For instance, saving, importing, creating a new view, showing the + * preference window, etc. * - * @return the global actions. + * @return the project actions. */ - public Actions getGlobalActions() + public Actions getProjectActions() { - return globalActions; + return projectActions; } } diff --git a/src/main/java/org/mastodon/app/ui/MastodonFrameView.java b/src/main/java/org/mastodon/app/ui/MastodonFrameView.java index bf050ca21..3c7757a48 100644 --- a/src/main/java/org/mastodon/app/ui/MastodonFrameView.java +++ b/src/main/java/org/mastodon/app/ui/MastodonFrameView.java @@ -115,11 +115,11 @@ public void windowClosing( final WindowEvent e ) } ); this.frame = frame; - final Actions globalActions = appModel.getGlobalActions(); - if ( globalActions != null ) + final Actions projectActions = appModel.getProjectActions(); + if ( projectActions != null ) { - frame.keybindings.addActionMap( "global", new WrappedActionMap( globalActions.getActionMap() ) ); - frame.keybindings.addInputMap( "global", new WrappedInputMap( globalActions.getInputMap() ) ); + frame.keybindings.addActionMap( "project", new WrappedActionMap( projectActions.getActionMap() ) ); + frame.keybindings.addInputMap( "project", new WrappedInputMap( projectActions.getInputMap() ) ); } final Actions pluginActions = appModel.getPlugins().getPluginActions(); @@ -129,9 +129,9 @@ public void windowClosing( final WindowEvent e ) frame.keybindings.addInputMap( "plugin", new WrappedInputMap( pluginActions.getInputMap() ) ); } - final Actions appActions = appModel.getAppActions(); - frame.keybindings.addActionMap( "app", new WrappedActionMap( appActions.getActionMap() ) ); - frame.keybindings.addInputMap( "app", new WrappedInputMap( appActions.getInputMap() ) ); + final Actions modelActions = appModel.getModelActions(); + frame.keybindings.addActionMap( "model", new WrappedActionMap( modelActions.getActionMap() ) ); + frame.keybindings.addInputMap( "model", new WrappedInputMap( modelActions.getInputMap() ) ); final Keymap keymap = appModel.getKeymap(); diff --git a/src/main/java/org/mastodon/mamut/MainWindow.java b/src/main/java/org/mastodon/mamut/MainWindow.java index 9a4b2c8e1..967650def 100644 --- a/src/main/java/org/mastodon/mamut/MainWindow.java +++ b/src/main/java/org/mastodon/mamut/MainWindow.java @@ -89,31 +89,31 @@ public MainWindow( final MamutAppModel appModel ) setLocationRelativeTo( null ); // Re-register save actions, this time using this frame as parent component. - ProjectActions.installAppActions( appModel.getAppActions(), appModel, this ); + ProjectActions.installAppActions( appModel.getProjectActions(), appModel, this ); - final ActionMap actionMap = appModel.getAppActions().getActionMap(); + // Views: final JPanel buttonsPanel = new JPanel(); buttonsPanel.setLayout( new MigLayout() ); + final ActionMap projectActionMap = appModel.getProjectActions().getActionMap(); - // Views: final JLabel viewsLabel = new JLabel( "Views:" ); viewsLabel.setFont( buttonsPanel.getFont().deriveFont( Font.BOLD ) ); buttonsPanel.add( viewsLabel, "span, wrap" ); - final JButton tableButton = new JButton( actionMap.get( WindowManager.NEW_TABLE_VIEW ) ); + final JButton tableButton = new JButton( projectActionMap.get( WindowManager.NEW_TABLE_VIEW ) ); prepareButton( tableButton, "table", TABLE_ICON_MEDIUM ); buttonsPanel.add( tableButton, "grow" ); - final JButton bdvButton = new JButton( actionMap.get( WindowManager.NEW_BDV_VIEW ) ); + final JButton bdvButton = new JButton( projectActionMap.get( WindowManager.NEW_BDV_VIEW ) ); prepareButton( bdvButton, "bdv", BDV_ICON_MEDIUM ); buttonsPanel.add( bdvButton, "grow, wrap" ); - final JButton selectionTableButton = new JButton( actionMap.get( WindowManager.NEW_SELECTION_TABLE_VIEW ) ); + final JButton selectionTableButton = new JButton( projectActionMap.get( WindowManager.NEW_SELECTION_TABLE_VIEW ) ); prepareButton( selectionTableButton, "selection table", TABLE_ICON_MEDIUM ); buttonsPanel.add( selectionTableButton, "grow" ); - final JButton trackschemeButton = new JButton( actionMap.get( WindowManager.NEW_TRACKSCHEME_VIEW ) ); + final JButton trackschemeButton = new JButton( projectActionMap.get( WindowManager.NEW_TRACKSCHEME_VIEW ) ); prepareButton( trackschemeButton, "trackscheme", TRACKSCHEME_ICON_MEDIUM ); buttonsPanel.add( trackschemeButton, "grow, wrap" ); @@ -124,15 +124,15 @@ public MainWindow( final MamutAppModel appModel ) processingLabel.setFont( buttonsPanel.getFont().deriveFont( Font.BOLD ) ); buttonsPanel.add( processingLabel, "span, wrap" ); - final JButton grapherButton = new JButton( actionMap.get( WindowManager.NEW_GRAPHER_VIEW ) ); + final JButton grapherButton = new JButton( projectActionMap.get( WindowManager.NEW_GRAPHER_VIEW ) ); prepareButton( grapherButton, "grapher", FEATURES_ICON_MEDIUM ); buttonsPanel.add( grapherButton, "grow" ); - final JButton featureComputationButton = new JButton( actionMap.get( WindowManager.COMPUTE_FEATURE_DIALOG ) ); + final JButton featureComputationButton = new JButton( projectActionMap.get( WindowManager.COMPUTE_FEATURE_DIALOG ) ); prepareButton( featureComputationButton, "compute features", FEATURES_ICON_MEDIUM ); buttonsPanel.add( featureComputationButton, "grow, wrap" ); - final JButton editTagSetsButton = new JButton( actionMap.get( WindowManager.TAGSETS_DIALOG ) ); + final JButton editTagSetsButton = new JButton( projectActionMap.get( WindowManager.TAGSETS_DIALOG ) ); prepareButton( editTagSetsButton, "configure tags", TAGS_ICON_MEDIUM ); buttonsPanel.add( editTagSetsButton, "grow, wrap" ); @@ -143,11 +143,11 @@ public MainWindow( final MamutAppModel appModel ) ioLabel.setFont( buttonsPanel.getFont().deriveFont( Font.BOLD ) ); buttonsPanel.add( ioLabel, "span, wrap" ); - final JButton saveProjectButton = new JButton( actionMap.get( ProjectActions.SAVE_PROJECT ) ); + final JButton saveProjectButton = new JButton( projectActionMap.get( ProjectActions.SAVE_PROJECT ) ); prepareButton( saveProjectButton, "save", SAVE_ICON_MEDIUM ); buttonsPanel.add( saveProjectButton, "grow" ); - final JButton loadProjectButton = new JButton( actionMap.get( ProjectActions.SAVE_PROJECT_AS ) ); + final JButton loadProjectButton = new JButton( projectActionMap.get( ProjectActions.SAVE_PROJECT_AS ) ); prepareButton( loadProjectButton, "save as...", SAVE_AS_ICON_MEDIUM ); buttonsPanel.add( loadProjectButton, "grow, wrap" ); @@ -178,7 +178,7 @@ public void paintComponent( final Graphics g ) final Keymap keymap = appModel.getKeymapManager().getForwardDefaultKeymap(); menu = new ViewMenu( menubar, keymap, KeyConfigContexts.MASTODON ); keymap.updateListeners().add( menu::updateKeymap ); - addMenus( menu, actionMap ); + addMenus( menu, projectActionMap ); appModel.getPlugins().addMenus( menu ); setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE ); @@ -205,7 +205,7 @@ public void windowClosing( final WindowEvent e ) */ public boolean close() { - final Action saveAction = appModel.getAppActions().getActionMap().get( ProjectActions.SAVE_PROJECT ); + final Action saveAction = appModel.getModelActions().getActionMap().get( ProjectActions.SAVE_PROJECT ); if ( appModel.getModel().isSavePoint() ) { appModel.close(); diff --git a/src/main/java/org/mastodon/mamut/MamutAppModel.java b/src/main/java/org/mastodon/mamut/MamutAppModel.java index dedc09164..d73866dde 100644 --- a/src/main/java/org/mastodon/mamut/MamutAppModel.java +++ b/src/main/java/org/mastodon/mamut/MamutAppModel.java @@ -110,12 +110,12 @@ public MamutAppModel( final Keymap keymap = keymapManager.getForwardDefaultKeymap(); keymap.updateListeners().add( () -> { - getGlobalActions().updateKeyConfig( keymap.getConfig() ); - getAppActions().updateKeyConfig( keymap.getConfig() ); + getProjectActions().updateKeyConfig( keymap.getConfig() ); + getModelActions().updateKeyConfig( keymap.getConfig() ); } ); // Register save / export actions - ProjectActions.installAppActions( getAppActions(), this, null ); + ProjectActions.installAppActions( getModelActions(), this, null ); this.branchGraphSync = new BranchGraphSynchronizer( model.getBranchGraph(), model.getGraph().getLock().readLock() ); model.getGraph().addGraphChangeListener( branchGraphSync ); @@ -138,9 +138,9 @@ public MamutAppModel( discoverPlugins(); // Install common actions. - UndoActions.install( getAppActions(), model ); - SelectionActions.install( getAppActions(), model.getGraph(), model.getGraph().getLock(), model.getGraph(), getSelectionModel(), model ); - MamutActions.install( getAppActions(), this ); + UndoActions.install( getModelActions(), model ); + SelectionActions.install( getModelActions(), model.getGraph(), model.getGraph().getLock(), model.getGraph(), getSelectionModel(), model ); + MamutActions.install( getModelActions(), this ); } public WindowManager getWindowManager() diff --git a/src/main/java/org/mastodon/mamut/MamutBranchView.java b/src/main/java/org/mastodon/mamut/MamutBranchView.java index ff229b892..19036d08e 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchView.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchView.java @@ -203,11 +203,11 @@ public void windowClosing( final WindowEvent e ) } ); this.frame = frame; - final Actions globalActions = appModel.getGlobalActions(); - if ( globalActions != null ) + final Actions projectActions = appModel.getProjectActions(); + if ( projectActions != null ) { - frame.getKeybindings().addActionMap( "global", new WrappedActionMap( globalActions.getActionMap() ) ); - frame.getKeybindings().addInputMap( "global", new WrappedInputMap( globalActions.getInputMap() ) ); + frame.getKeybindings().addActionMap( "project", new WrappedActionMap( projectActions.getActionMap() ) ); + frame.getKeybindings().addInputMap( "project", new WrappedInputMap( projectActions.getInputMap() ) ); } final Actions pluginActions = appModel.getPlugins().getPluginActions(); @@ -217,9 +217,9 @@ public void windowClosing( final WindowEvent e ) frame.getKeybindings().addInputMap( "plugin", new WrappedInputMap( pluginActions.getInputMap() ) ); } - final Actions appActions = appModel.getAppActions(); - frame.getKeybindings().addActionMap( "app", new WrappedActionMap( appActions.getActionMap() ) ); - frame.getKeybindings().addInputMap( "app", new WrappedInputMap( appActions.getInputMap() ) ); + final Actions modelActions = appModel.getModelActions(); + frame.getKeybindings().addActionMap( "model", new WrappedActionMap( modelActions.getActionMap() ) ); + frame.getKeybindings().addInputMap( "model", new WrappedInputMap( modelActions.getInputMap() ) ); final Keymap keymap = appModel.getKeymap(); diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index fac7330a7..db0d6aa90 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -217,9 +217,12 @@ public WindowManager( final MamutAppModel appModel ) this.featureColorModeManager = new FeatureColorModeManager(); final Context context = appModel.getContext(); this.featureProjectionsManager = new MamutFeatureProjectionsManager( context.getService( FeatureSpecsService.class ), featureColorModeManager ); + final Model model = appModel.getModel(); + featureProjectionsManager.setModel( model, appModel.getSharedBdvData().getSources().size() ); this.keymapManager = new KeymapManager(); - final Keymap keymap = keymapManager.getForwardDefaultKeymap(); + // TODO: still needed? + this.bdvViewCreatedListeners = new Listeners.SynchronizedList<>(); final CommandDescriptions descriptions = buildCommandDescriptions(); final Consumer< Keymap > augmentInputTriggerConfig = @@ -227,7 +230,9 @@ public WindowManager( final MamutAppModel appModel ) keymapManager.getUserStyles().forEach( augmentInputTriggerConfig ); keymapManager.getBuiltinStyles().forEach( augmentInputTriggerConfig ); - final Actions globalAppActions = appModel.getAppActions(); + /* + * Actions to create views. + */ this.newBdvViewAction = new RunnableActionPair( NEW_BDV_VIEW, this::createBigDataViewer, this::createBranchBigDataViewer ); this.newTrackSchemeViewAction = new RunnableActionPair( NEW_TRACKSCHEME_VIEW, this::createTrackScheme, this::createBranchTrackScheme ); @@ -241,17 +246,18 @@ public WindowManager( final MamutAppModel appModel ) this.newHierarchyTrackSchemeViewAction = new RunnableAction( NEW_HIERARCHY_TRACKSCHEME_VIEW, this::createHierarchyTrackScheme ); final RunnableAction openOnlineDocumentation = new RunnableAction( OPEN_ONLINE_DOCUMENTATION, this::openOnlineDocumentation ); - globalAppActions.namedAction( newBdvViewAction, NEW_BDV_VIEW_KEYS ); - globalAppActions.namedAction( newTrackSchemeViewAction, NEW_TRACKSCHEME_VIEW_KEYS ); - globalAppActions.namedAction( newTableViewAction, NEW_SELECTION_TABLE_VIEW_KEYS ); - globalAppActions.namedAction( newSelectionTableViewAction, NEW_SELECTION_TABLE_VIEW_KEYS ); - globalAppActions.namedAction( newGrapherViewAction, NEW_GRAPHER_VIEW_KEYS ); - globalAppActions.namedAction( editTagSetsAction, TAGSETS_DIALOG_KEYS ); - globalAppActions.namedAction( featureComputationAction, COMPUTE_FEATURE_DIALOG_KEYS ); - globalAppActions.namedAction( newBranchBdvViewAction, NEW_BRANCH_BDV_VIEW_KEYS ); - globalAppActions.namedAction( newBranchTrackSchemeViewAction, NEW_BRANCH_TRACKSCHEME_VIEW_KEYS ); - globalAppActions.namedAction( newHierarchyTrackSchemeViewAction, NEW_HIERARCHY_TRACKSCHEME_VIEW_KEYS ); - globalAppActions.namedAction( openOnlineDocumentation, OPEN_ONLINE_DOCUMENTATION_KEYS ); + final Actions projectActions = appModel.getProjectActions(); + projectActions.namedAction( newBdvViewAction, NEW_BDV_VIEW_KEYS ); + projectActions.namedAction( newTrackSchemeViewAction, NEW_TRACKSCHEME_VIEW_KEYS ); + projectActions.namedAction( newTableViewAction, NEW_SELECTION_TABLE_VIEW_KEYS ); + projectActions.namedAction( newSelectionTableViewAction, NEW_SELECTION_TABLE_VIEW_KEYS ); + projectActions.namedAction( newGrapherViewAction, NEW_GRAPHER_VIEW_KEYS ); + projectActions.namedAction( editTagSetsAction, TAGSETS_DIALOG_KEYS ); + projectActions.namedAction( featureComputationAction, COMPUTE_FEATURE_DIALOG_KEYS ); + projectActions.namedAction( newBranchBdvViewAction, NEW_BRANCH_BDV_VIEW_KEYS ); + projectActions.namedAction( newBranchTrackSchemeViewAction, NEW_BRANCH_TRACKSCHEME_VIEW_KEYS ); + projectActions.namedAction( newHierarchyTrackSchemeViewAction, NEW_HIERARCHY_TRACKSCHEME_VIEW_KEYS ); + projectActions.namedAction( openOnlineDocumentation, OPEN_ONLINE_DOCUMENTATION_KEYS ); this.settings = new PreferencesDialog( null, keymap, new String[] { KeyConfigContexts.MASTODON } ); settings.addPage( new TrackSchemeStyleSettingsPage( "TrackScheme Styles", trackSchemeStyleManager ) ); @@ -263,18 +269,15 @@ public WindowManager( final MamutAppModel appModel ) settings.pack(); final ToggleDialogAction tooglePreferencesDialogAction = new ToggleDialogAction( PREFERENCES_DIALOG, settings ); - globalAppActions.namedAction( tooglePreferencesDialogAction, PREFERENCES_DIALOG_KEYS ); + projectActions.namedAction( tooglePreferencesDialogAction, PREFERENCES_DIALOG_KEYS ); - this.bdvViewCreatedListeners = new Listeners.SynchronizedList<>(); - final Model model = appModel.getModel(); tagSetDialog = new TagSetDialog( null, model.getTagSetModel(), model, keymap, new String[] { KeyConfigContexts.MASTODON } ); tagSetDialog.setIconImages( TAGS_ICON ); featureComputationDialog = MamutFeatureComputation.getDialog( appModel, context ); featureComputationDialog.setIconImages( FEATURES_ICON ); - featureProjectionsManager.setModel( model, appModel.getSharedBdvData().getSources().size() ); } private synchronized void addBdvWindow( final MamutViewBdv w ) From d1874a8ef9961d8dc7c4f4ba42d22f3f8d1fbe52 Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Wed, 16 Aug 2023 20:58:36 +0200 Subject: [PATCH 007/220] Remove unused fields. --- .../org/mastodon/mamut/WindowManager.java | 41 +++++-------------- 1 file changed, 10 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index db0d6aa90..d1429fbf3 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -80,7 +80,6 @@ import org.scijava.listeners.Listeners; import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.KeyPressedManager; -import org.scijava.ui.behaviour.util.AbstractNamedAction; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.RunnableAction; @@ -170,26 +169,6 @@ public class WindowManager private final KeymapManager keymapManager; - private final AbstractNamedAction newBdvViewAction; - - private final AbstractNamedAction newTrackSchemeViewAction; - - private final AbstractNamedAction newHierarchyTrackSchemeViewAction; - - private final AbstractNamedAction newTableViewAction; - - private final AbstractNamedAction newSelectionTableViewAction; - - private final AbstractNamedAction newGrapherViewAction; - - private final AbstractNamedAction newBranchBdvViewAction; - - private final AbstractNamedAction newBranchTrackSchemeViewAction; - - private final AbstractNamedAction editTagSetsAction; - - private final AbstractNamedAction featureComputationAction; - private final TagSetDialog tagSetDialog; private final JDialog featureComputationDialog; @@ -234,16 +213,16 @@ public WindowManager( final MamutAppModel appModel ) * Actions to create views. */ - this.newBdvViewAction = new RunnableActionPair( NEW_BDV_VIEW, this::createBigDataViewer, this::createBranchBigDataViewer ); - this.newTrackSchemeViewAction = new RunnableActionPair( NEW_TRACKSCHEME_VIEW, this::createTrackScheme, this::createBranchTrackScheme ); - this.newTableViewAction = new RunnableAction( NEW_TABLE_VIEW, () -> createTable( false ) ); - this.newSelectionTableViewAction = new RunnableAction( NEW_SELECTION_TABLE_VIEW, () -> createTable( true ) ); - this.newGrapherViewAction = new RunnableAction( NEW_GRAPHER_VIEW, this::createGrapher ); - this.editTagSetsAction = new RunnableAction( TAGSETS_DIALOG, this::editTagSets ); - this.featureComputationAction = new RunnableAction( COMPUTE_FEATURE_DIALOG, this::computeFeatures ); - this.newBranchBdvViewAction = new RunnableAction( NEW_BRANCH_BDV_VIEW, this::createBranchBigDataViewer ); - this.newBranchTrackSchemeViewAction = new RunnableAction( NEW_BRANCH_TRACKSCHEME_VIEW, this::createBranchTrackScheme ); - this.newHierarchyTrackSchemeViewAction = new RunnableAction( NEW_HIERARCHY_TRACKSCHEME_VIEW, this::createHierarchyTrackScheme ); + final RunnableActionPair newBdvViewAction = new RunnableActionPair( NEW_BDV_VIEW, this::createBigDataViewer, this::createBranchBigDataViewer ); + final RunnableActionPair newTrackSchemeViewAction = new RunnableActionPair( NEW_TRACKSCHEME_VIEW, this::createTrackScheme, this::createBranchTrackScheme ); + final RunnableAction newTableViewAction = new RunnableAction( NEW_TABLE_VIEW, () -> createTable( false ) ); + final RunnableAction newSelectionTableViewAction = new RunnableAction( NEW_SELECTION_TABLE_VIEW, () -> createTable( true ) ); + final RunnableAction newGrapherViewAction = new RunnableAction( NEW_GRAPHER_VIEW, this::createGrapher ); + final RunnableAction editTagSetsAction = new RunnableAction( TAGSETS_DIALOG, this::editTagSets ); + final RunnableAction featureComputationAction = new RunnableAction( COMPUTE_FEATURE_DIALOG, this::computeFeatures ); + final RunnableAction newBranchBdvViewAction = new RunnableAction( NEW_BRANCH_BDV_VIEW, this::createBranchBigDataViewer ); + final RunnableAction newBranchTrackSchemeViewAction = new RunnableAction( NEW_BRANCH_TRACKSCHEME_VIEW, this::createBranchTrackScheme ); + final RunnableAction newHierarchyTrackSchemeViewAction = new RunnableAction( NEW_HIERARCHY_TRACKSCHEME_VIEW, this::createHierarchyTrackScheme ); final RunnableAction openOnlineDocumentation = new RunnableAction( OPEN_ONLINE_DOCUMENTATION, this::openOnlineDocumentation ); final Actions projectActions = appModel.getProjectActions(); From 50d26bc4a88461e08e5ee85814f5af46c43328e1 Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Wed, 16 Aug 2023 21:39:44 +0200 Subject: [PATCH 008/220] Remove duplicate fields in WindowManager. We rely on MamutAppModel for non-view related fields. Also, do not test for appModel == null anymore. --- .../org/mastodon/mamut/WindowManager.java | 106 +++++------------- 1 file changed, 29 insertions(+), 77 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index d1429fbf3..becbb231d 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -79,7 +79,6 @@ import org.scijava.Context; import org.scijava.listeners.Listeners; import org.scijava.plugin.Plugin; -import org.scijava.ui.behaviour.KeyPressedManager; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.RunnableAction; @@ -111,8 +110,8 @@ public class WindowManager public static final String TAGSETS_DIALOG = "edit tag sets"; public static final String COMPUTE_FEATURE_DIALOG = "compute features"; public static final String OPEN_ONLINE_DOCUMENTATION = "open online documentation"; - static final String[] NEW_BDV_VIEW_KEYS = new String[] { "not mapped" }; + static final String[] NEW_TRACKSCHEME_VIEW_KEYS = new String[] { "not mapped" }; static final String[] NEW_TABLE_VIEW_KEYS = new String[] { "not mapped" }; static final String[] NEW_SELECTION_TABLE_VIEW_KEYS = new String[] { "not mapped" }; @@ -155,8 +154,6 @@ public class WindowManager /** All currently open Grapher windows. */ private final List< MamutViewGrapher > grapherWindows = new ArrayList<>(); - private final KeyPressedManager keyPressedManager; - private final TrackSchemeStyleManager trackSchemeStyleManager; private final DataDisplayStyleManager dataDisplayStyleManager; @@ -167,8 +164,6 @@ public class WindowManager private final MamutFeatureProjectionsManager featureProjectionsManager; - private final KeymapManager keymapManager; - private final TagSetDialog tagSetDialog; private final JDialog featureComputationDialog; @@ -189,7 +184,6 @@ public class WindowManager public WindowManager( final MamutAppModel appModel ) { this.appModel = appModel; - this.keyPressedManager = new KeyPressedManager(); this.trackSchemeStyleManager = new TrackSchemeStyleManager(); this.dataDisplayStyleManager = new DataDisplayStyleManager(); this.renderSettingsManager = new RenderSettingsManager(); @@ -198,7 +192,7 @@ public WindowManager( final MamutAppModel appModel ) this.featureProjectionsManager = new MamutFeatureProjectionsManager( context.getService( FeatureSpecsService.class ), featureColorModeManager ); final Model model = appModel.getModel(); featureProjectionsManager.setModel( model, appModel.getSharedBdvData().getSources().size() ); - this.keymapManager = new KeymapManager(); + final KeymapManager keymapManager = appModel.getKeymapManager(); final Keymap keymap = keymapManager.getForwardDefaultKeymap(); // TODO: still needed? this.bdvViewCreatedListeners = new Listeners.SynchronizedList<>(); @@ -250,8 +244,6 @@ public WindowManager( final MamutAppModel appModel ) final ToggleDialogAction tooglePreferencesDialogAction = new ToggleDialogAction( PREFERENCES_DIALOG, settings ); projectActions.namedAction( tooglePreferencesDialogAction, PREFERENCES_DIALOG_KEYS ); - - tagSetDialog = new TagSetDialog( null, model.getTagSetModel(), model, keymap, new String[] { KeyConfigContexts.MASTODON } ); tagSetDialog.setIconImages( TAGS_ICON ); @@ -513,14 +505,10 @@ public MamutViewTrackScheme createTrackScheme() */ public MamutViewTrackScheme createTrackScheme( final Map< String, Object > guiState ) { - if ( appModel != null ) - { - final MamutViewTrackScheme view = new MamutViewTrackScheme( appModel, guiState ); - view.getFrame().setIconImages( TRACKSCHEME_VIEW_ICON ); - addTsWindow( view ); - return view; - } - return null; + final MamutViewTrackScheme view = new MamutViewTrackScheme( appModel, guiState ); + view.getFrame().setIconImages( TRACKSCHEME_VIEW_ICON ); + addTsWindow( view ); + return view; } /** @@ -562,14 +550,10 @@ public MamutViewTrackScheme createTrackScheme( final Map< String, Object > guiSt */ public MamutViewTable createTable( final Map< String, Object > guiState ) { - if ( appModel != null ) - { - final MamutViewTable view = new MamutViewTable( appModel, guiState ); - view.getFrame().setIconImages( TABLE_VIEW_ICON ); - addTableWindow( view ); - return view; - } - return null; + final MamutViewTable view = new MamutViewTable( appModel, guiState ); + view.getFrame().setIconImages( TABLE_VIEW_ICON ); + addTableWindow( view ); + return view; } /** @@ -636,14 +620,10 @@ public MamutViewGrapher createGrapher() */ public MamutViewGrapher createGrapher( final Map< String, Object > guiState ) { - if ( appModel != null ) - { - final MamutViewGrapher view = new MamutViewGrapher( appModel, guiState ); - view.getFrame().setIconImages( FEATURES_ICON ); - addGrapherWindow( view ); - return view; - } - return null; + final MamutViewGrapher view = new MamutViewGrapher( appModel, guiState ); + view.getFrame().setIconImages( FEATURES_ICON ); + addGrapherWindow( view ); + return view; } /** @@ -665,14 +645,10 @@ public MamutBranchViewBdv createBranchBigDataViewer() */ public MamutBranchViewBdv createBranchBigDataViewer( final Map< String, Object > guiState ) { - if ( appModel != null ) - { - final MamutBranchViewBdv view = new MamutBranchViewBdv( appModel, guiState ); - view.getFrame().setIconImages( BDV_VIEW_ICON ); - addBBdvWindow( view ); - return view; - } - return null; + final MamutBranchViewBdv view = new MamutBranchViewBdv( appModel, guiState ); + view.getFrame().setIconImages( BDV_VIEW_ICON ); + addBBdvWindow( view ); + return view; } /** @@ -694,14 +670,10 @@ public MamutBranchViewTrackScheme createBranchTrackScheme() */ public MamutBranchViewTrackScheme createBranchTrackScheme( final Map< String, Object > guiState ) { - if ( appModel != null ) - { - final MamutBranchViewTrackScheme view = new MamutBranchViewTrackScheme( appModel, guiState ); - view.getFrame().setIconImages( TRACKSCHEME_VIEW_ICON ); - addBTsWindow( view ); - return view; - } - return null; + final MamutBranchViewTrackScheme view = new MamutBranchViewTrackScheme( appModel, guiState ); + view.getFrame().setIconImages( TRACKSCHEME_VIEW_ICON ); + addBTsWindow( view ); + return view; } /** @@ -723,15 +695,11 @@ public MamutBranchViewTrackScheme createHierarchyTrackScheme() */ public MamutBranchViewTrackScheme createHierarchyTrackScheme( final Map< String, Object > guiState ) { - if ( appModel != null ) - { - final MamutBranchViewTrackSchemeHierarchy view = - new MamutBranchViewTrackSchemeHierarchy( appModel, guiState ); - view.getFrame().setIconImages( TRACKSCHEME_VIEW_ICON ); - addBTsWindow( view ); - return view; - } - return null; + final MamutBranchViewTrackSchemeHierarchy view = + new MamutBranchViewTrackSchemeHierarchy( appModel, guiState ); + view.getFrame().setIconImages( TRACKSCHEME_VIEW_ICON ); + addBTsWindow( view ); + return view; } /** @@ -756,10 +724,7 @@ public void openOnlineDocumentation() */ public void editTagSets() { - if ( appModel != null ) - { - tagSetDialog.setVisible( true ); - } + tagSetDialog.setVisible( true ); } /** @@ -767,10 +732,7 @@ public void editTagSets() */ public void computeFeatures() { - if ( appModel != null ) - { - featureComputationDialog.setVisible( true ); - } + featureComputationDialog.setVisible( true ); } /** @@ -821,11 +783,6 @@ public void dispose() settings.dispose(); } - KeyPressedManager getKeyPressedManager() - { - return keyPressedManager; - } - TrackSchemeStyleManager getTrackSchemeStyleManager() { return trackSchemeStyleManager; @@ -851,11 +808,6 @@ MamutFeatureProjectionsManager getFeatureProjectionsManager() return featureProjectionsManager; } - KeymapManager getKeymapManager() - { - return keymapManager; - } - public PreferencesDialog getPreferencesDialog() { return settings; From b41efdddd9eaa42441938eeeeb544512b5864263 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 17 Aug 2023 12:59:38 +0200 Subject: [PATCH 009/220] Rename MamutAppModel in ProjectModel. --- .../java/org/mastodon/mamut/MainWindow.java | 4 ++-- .../java/org/mastodon/mamut/MamutActions.java | 6 ++--- .../org/mastodon/mamut/MamutBranchView.java | 6 ++--- .../mastodon/mamut/MamutBranchViewBdv.java | 6 ++--- .../mamut/MamutBranchViewTrackScheme.java | 10 ++++---- .../MamutBranchViewTrackSchemeHierarchy.java | 6 ++--- .../mamut/MamutFeatureComputation.java | 2 +- .../java/org/mastodon/mamut/MamutView.java | 4 ++-- .../java/org/mastodon/mamut/MamutViewBdv.java | 4 ++-- .../org/mastodon/mamut/MamutViewGrapher.java | 4 ++-- .../org/mastodon/mamut/MamutViewTable.java | 18 +++++++------- .../mastodon/mamut/MamutViewTrackScheme.java | 4 ++-- .../{MamutAppModel.java => ProjectModel.java} | 6 ++--- .../org/mastodon/mamut/WindowManager.java | 4 ++-- .../org/mastodon/mamut/io/ProjectActions.java | 4 ++-- .../org/mastodon/mamut/io/ProjectCreator.java | 14 +++++------ .../mastodon/mamut/io/ProjectExporter.java | 4 ++-- .../mastodon/mamut/io/ProjectImporter.java | 12 +++++----- .../org/mastodon/mamut/io/ProjectLoader.java | 24 +++++++++---------- .../org/mastodon/mamut/io/ProjectSaver.java | 12 +++++----- .../mamut/launcher/MastodonDndLauncher.java | 4 ++-- .../mamut/launcher/MastodonLauncher.java | 16 ++++++------- .../mastodon/mamut/plugin/MamutPlugin.java | 4 ++-- .../mastodon/mamut/plugin/MamutPlugins.java | 4 ++-- .../mamut/plugin/MamutTestPlugin.java | 4 ++-- .../org/mastodon/StartMastodonOnProject.java | 4 ++-- .../mastodon/graph/BranchGraphExample.java | 4 ++-- .../org/mastodon/mamut/CloseListenerTest.java | 6 ++--- .../mastodon/mamut/GarbageCollectionTest.java | 2 +- .../org/mastodon/mamut/MamutPlayground.java | 2 +- .../mastodon/mamut/ProjectManagerTest.java | 2 +- .../StartMastodonWithMissingImageDemo.java | 2 +- .../feature/RawDeserializationExample.java | 4 ++-- .../feature/SerializeFeatureExample.java | 6 ++--- .../mamut/feature/SpotIntensityBenchmark.java | 4 ++-- .../feature/SpotIntensityUpdateExample.java | 4 ++-- .../mamut/importer/MaMuTExportExample.java | 4 ++-- .../mamut/importer/MaMuTImporterExample.java | 6 ++--- .../mamut/tags/PlayingWithTagsExample.java | 4 ++-- .../java/org/mastodon/util/MastodonUtils.java | 10 ++++---- 40 files changed, 125 insertions(+), 125 deletions(-) rename src/main/java/org/mastodon/mamut/{MamutAppModel.java => ProjectModel.java} (97%) diff --git a/src/main/java/org/mastodon/mamut/MainWindow.java b/src/main/java/org/mastodon/mamut/MainWindow.java index 967650def..174f16c8a 100644 --- a/src/main/java/org/mastodon/mamut/MainWindow.java +++ b/src/main/java/org/mastodon/mamut/MainWindow.java @@ -78,9 +78,9 @@ public class MainWindow extends JFrame private final ViewMenu menu; - private final MamutAppModel appModel; + private final ProjectModel appModel; - public MainWindow( final MamutAppModel appModel ) + public MainWindow( final ProjectModel appModel ) { super( "Mastodon" ); this.appModel = appModel; diff --git a/src/main/java/org/mastodon/mamut/MamutActions.java b/src/main/java/org/mastodon/mamut/MamutActions.java index 97e8feadb..3f2d57b5b 100644 --- a/src/main/java/org/mastodon/mamut/MamutActions.java +++ b/src/main/java/org/mastodon/mamut/MamutActions.java @@ -77,11 +77,11 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) } } - private final MamutAppModel appModel; + private final ProjectModel appModel; private final LinkSpotsInSelection linkSpotsInSelection; - public MamutActions( final MamutAppModel appModel ) + public MamutActions( final ProjectModel appModel ) { this.appModel = appModel; this.linkSpotsInSelection = new LinkSpotsInSelection( LINK_SELECTED_SPOTS ); @@ -89,7 +89,7 @@ public MamutActions( final MamutAppModel appModel ) public static void install( final Actions actions, - final MamutAppModel appModel ) + final ProjectModel appModel ) { final MamutActions mamutActions = new MamutActions( appModel ); actions.namedAction( mamutActions.linkSpotsInSelection, LINK_SELECTED_SPOTS_KEYS ); diff --git a/src/main/java/org/mastodon/mamut/MamutBranchView.java b/src/main/java/org/mastodon/mamut/MamutBranchView.java index 19036d08e..849fc7ee1 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchView.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchView.java @@ -100,7 +100,7 @@ public class MamutBranchView< */ public static final String BRANCH_GRAPH = "BranchGraph"; - protected final MamutAppModel appModel; + protected final ProjectModel appModel; protected ViewFrame frame; @@ -132,7 +132,7 @@ public class MamutBranchView< protected final TagSetModel< BranchSpot, BranchLink > tagSetModel; - public MamutBranchView( final MamutAppModel appModel, final VG viewGraph, final String[] keyConfigContexts ) + public MamutBranchView( final ProjectModel appModel, final VG viewGraph, final String[] keyConfigContexts ) { this.appModel = appModel; this.viewGraph = viewGraph; @@ -359,7 +359,7 @@ public GroupHandle getGroupHandle() return groupHandle; } - private static TagSetModel< BranchSpot, BranchLink > branchTagSetModel( final MamutAppModel appModel ) + private static TagSetModel< BranchSpot, BranchLink > branchTagSetModel( final ProjectModel appModel ) { final ModelGraph graph = appModel.getModel().getGraph(); final ModelBranchGraph branchGraph = appModel.getModel().getBranchGraph(); diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java index 610720125..b1d60c4d2 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java @@ -106,12 +106,12 @@ public class MamutBranchViewBdv extends MamutBranchView< private final ColorBarOverlay colorBarOverlay; - public MamutBranchViewBdv( final MamutAppModel appModel ) + public MamutBranchViewBdv( final ProjectModel appModel ) { this( appModel, new HashMap<>() ); } - public MamutBranchViewBdv( final MamutAppModel appModel, final Map< String, Object > guiState ) + public MamutBranchViewBdv( final ProjectModel appModel, final Map< String, Object > guiState ) { super( appModel, createViewBranchGraph( appModel ), new String[] { KeyConfigContexts.BIGDATAVIEWER } ); @@ -295,7 +295,7 @@ public ViewerPanel getViewerPanelMamut() return viewer; } - private static OverlayGraphWrapper< BranchSpot, BranchLink > createViewBranchGraph( final MamutAppModel appModel ) + private static OverlayGraphWrapper< BranchSpot, BranchLink > createViewBranchGraph( final ProjectModel appModel ) { // Model. final Model model = appModel.getModel(); diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java index 284382ff8..94dd76b93 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java @@ -101,19 +101,19 @@ public class MamutBranchViewTrackScheme private final ColoringModel coloringModel; - public MamutBranchViewTrackScheme( final MamutAppModel appModel ) + public MamutBranchViewTrackScheme( final ProjectModel appModel ) { this( appModel, new HashMap<>() ); } - public MamutBranchViewTrackScheme( final MamutAppModel appModel, final Map< String, Object > guiState ) + public MamutBranchViewTrackScheme( final ProjectModel appModel, final Map< String, Object > guiState ) { this( appModel, guiState, new BranchTimeTrackSchemeFactory(), new BranchTrackSchemeOverlayFactory(), LongEdgesLineageTreeLayout::new, null ); } protected MamutBranchViewTrackScheme( - final MamutAppModel appModel, + final ProjectModel appModel, final Map< String, Object > guiState, final BranchTrackSchemeFactory trackSchemeGraphFactory, final TrackSchemeOverlayFactory overlayFactory, @@ -350,7 +350,7 @@ public TrackSchemeOverlay create( */ public static interface BranchTrackSchemeFactory { - public TrackSchemeGraph< BranchSpot, BranchLink > createViewGraph( final MamutAppModel appModel ); + public TrackSchemeGraph< BranchSpot, BranchLink > createViewGraph( final ProjectModel appModel ); } /** @@ -361,7 +361,7 @@ public static class BranchTimeTrackSchemeFactory implements BranchTrackSchemeFac { @Override - public TrackSchemeGraph< BranchSpot, BranchLink > createViewGraph( final MamutAppModel appModel ) + public TrackSchemeGraph< BranchSpot, BranchLink > createViewGraph( final ProjectModel appModel ) { final Model model = appModel.getModel(); final ModelBranchGraph graph = model.getBranchGraph(); diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackSchemeHierarchy.java b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackSchemeHierarchy.java index ff78caa24..41e7a6cf6 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackSchemeHierarchy.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackSchemeHierarchy.java @@ -61,12 +61,12 @@ public class MamutBranchViewTrackSchemeHierarchy extends MamutBranchViewTrackSch private static final int MINIMUM_NUMBER_OF_HIERARCHY_LEVELS_SCROLLABLE = 30; - public MamutBranchViewTrackSchemeHierarchy( final MamutAppModel appModel ) + public MamutBranchViewTrackSchemeHierarchy( final ProjectModel appModel ) { this( appModel, new HashMap<>() ); } - public MamutBranchViewTrackSchemeHierarchy( final MamutAppModel appModel, final Map< String, Object > guiState ) + public MamutBranchViewTrackSchemeHierarchy( final ProjectModel appModel, final Map< String, Object > guiState ) { super( appModel, guiState, new BranchHierarchyTrackSchemeFactory(), new HierarchyTrackSchemeOverlayFactory(), LineageTreeLayoutImp::new, new DefaultTimepointModel() ); @@ -111,7 +111,7 @@ public static class BranchHierarchyTrackSchemeFactory extends BranchTimeTrackSch { @Override - public TrackSchemeGraph< BranchSpot, BranchLink > createViewGraph( final MamutAppModel appModel ) + public TrackSchemeGraph< BranchSpot, BranchLink > createViewGraph( final ProjectModel appModel ) { final Model model = appModel.getModel(); final ModelBranchGraph graph = model.getBranchGraph(); diff --git a/src/main/java/org/mastodon/mamut/MamutFeatureComputation.java b/src/main/java/org/mastodon/mamut/MamutFeatureComputation.java index 6c5a63e84..466348641 100644 --- a/src/main/java/org/mastodon/mamut/MamutFeatureComputation.java +++ b/src/main/java/org/mastodon/mamut/MamutFeatureComputation.java @@ -56,7 +56,7 @@ public class MamutFeatureComputation { - public static final JDialog getDialog( final MamutAppModel appModel, final Context context ) + public static final JDialog getDialog( final ProjectModel appModel, final Context context ) { // Prepare services. final MamutFeatureComputerService computerService = MamutFeatureComputerService.newInstance( context ); diff --git a/src/main/java/org/mastodon/mamut/MamutView.java b/src/main/java/org/mastodon/mamut/MamutView.java index d1b5ff790..470723419 100644 --- a/src/main/java/org/mastodon/mamut/MamutView.java +++ b/src/main/java/org/mastodon/mamut/MamutView.java @@ -67,7 +67,7 @@ import org.mastodon.views.trackscheme.display.ColorBarOverlay.Position; public class MamutView< VG extends ViewGraph< Spot, Link, V, E >, V extends Vertex< E >, E extends Edge< V > > - extends MastodonFrameView< MamutAppModel, VG, Spot, Link, V, E > + extends MastodonFrameView< ProjectModel, VG, Spot, Link, V, E > { /** @@ -127,7 +127,7 @@ public class MamutView< VG extends ViewGraph< Spot, Link, V, E >, V extends Vert */ public static final String GROUP_HANDLE_ID_KEY = "LockGroupId"; - public MamutView( final MamutAppModel appModel, final VG viewGraph, final String[] keyConfigContexts ) + public MamutView( final ProjectModel appModel, final VG viewGraph, final String[] keyConfigContexts ) { super( appModel, viewGraph, keyConfigContexts ); } diff --git a/src/main/java/org/mastodon/mamut/MamutViewBdv.java b/src/main/java/org/mastodon/mamut/MamutViewBdv.java index 08c5b25cc..edb7d0e11 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutViewBdv.java @@ -136,12 +136,12 @@ public class MamutViewBdv extends MamutView< OverlayGraphWrapper< Spot, Link >, private final ColorBarOverlay colorBarOverlay; - public MamutViewBdv( final MamutAppModel appModel ) + public MamutViewBdv( final ProjectModel appModel ) { this( appModel, new HashMap<>() ); } - public MamutViewBdv( final MamutAppModel appModel, final Map< String, Object > guiState ) + public MamutViewBdv( final ProjectModel appModel, final Map< String, Object > guiState ) { super( appModel, new OverlayGraphWrapper<>( diff --git a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java index 4bde57e28..2ef31cf07 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java +++ b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java @@ -112,12 +112,12 @@ public class MamutViewGrapher extends MamutView< DataGraph< Spot, Link >, DataVe private final ColorBarOverlay colorbarOverlay; - public MamutViewGrapher( final MamutAppModel appModel ) + public MamutViewGrapher( final ProjectModel appModel ) { this( appModel, new HashMap<>() ); } - public MamutViewGrapher( final MamutAppModel appModel, final Map< String, Object > guiState ) + public MamutViewGrapher( final ProjectModel appModel, final Map< String, Object > guiState ) { super( appModel, new DataGraph< Spot, Link >( diff --git a/src/main/java/org/mastodon/mamut/MamutViewTable.java b/src/main/java/org/mastodon/mamut/MamutViewTable.java index bf3e94445..b849bbae1 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTable.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTable.java @@ -154,13 +154,13 @@ public class MamutViewTable extends MamutView< ViewGraph< Spot, Link, Spot, Link private final boolean selectionTable; - public MamutViewTable( final MamutAppModel appModel, final boolean selectionOnly ) + public MamutViewTable( final ProjectModel appModel, final boolean selectionOnly ) { this( appModel, Collections.singletonMap( TABLE_SELECTION_ONLY, Boolean.valueOf( selectionOnly ) ) ); } - public MamutViewTable( final MamutAppModel appModel, final Map< String, Object > guiState ) + public MamutViewTable( final ProjectModel appModel, final Map< String, Object > guiState ) { super( appModel, createViewGraph( appModel ), CONTEXTS ); @@ -321,7 +321,7 @@ public MamutViewTable( final MamutAppModel appModel, final Map< String, Object > } private static final ColoringModel registerBranchColoring( - final MamutAppModel appModel, + final ProjectModel appModel, final GraphColorGeneratorAdapter< BranchSpot, BranchLink, BranchSpot, BranchLink > colorGeneratorAdapter, final JMenuHandle menuHandle, final Runnable refresh, @@ -364,7 +364,7 @@ else if ( coloringModel.getFeatureColorMode() != null ) return coloringModel; } - private static TagSetModel< BranchSpot, BranchLink > branchTagSetModel( final MamutAppModel appModel ) + private static TagSetModel< BranchSpot, BranchLink > branchTagSetModel( final ProjectModel appModel ) { final ModelGraph graph = appModel.getModel().getGraph(); final ModelBranchGraph branchGraph = appModel.getModel().getBranchGraph(); @@ -374,7 +374,7 @@ private static TagSetModel< BranchSpot, BranchLink > branchTagSetModel( final Ma return branchGraphTagSetModel; } - private static NavigationHandler< BranchSpot, BranchLink > branchGraphNavigation( final MamutAppModel appModel, + private static NavigationHandler< BranchSpot, BranchLink > branchGraphNavigation( final ProjectModel appModel, final NavigationHandler< Spot, Link > navigationHandler ) { final ModelGraph graph = appModel.getModel().getGraph(); @@ -385,7 +385,7 @@ private static NavigationHandler< BranchSpot, BranchLink > branchGraphNavigation return branchGraphNavigation; } - private static HighlightModel< BranchSpot, BranchLink > branchHighlightModel( final MamutAppModel appModel ) + private static HighlightModel< BranchSpot, BranchLink > branchHighlightModel( final ProjectModel appModel ) { final ModelGraph graph = appModel.getModel().getGraph(); final ModelBranchGraph branchGraph = appModel.getModel().getBranchGraph(); @@ -395,7 +395,7 @@ private static HighlightModel< BranchSpot, BranchLink > branchHighlightModel( fi return branchHighlightModel; } - private static FocusModel< BranchSpot, BranchLink > branchFocusfocusModel( final MamutAppModel appModel ) + private static FocusModel< BranchSpot, BranchLink > branchFocusfocusModel( final ProjectModel appModel ) { final ModelGraph graph = appModel.getModel().getGraph(); final ModelBranchGraph branchGraph = appModel.getModel().getBranchGraph(); @@ -405,7 +405,7 @@ private static FocusModel< BranchSpot, BranchLink > branchFocusfocusModel( final return branchFocusfocusModel; } - private static SelectionModel< BranchSpot, BranchLink > branchSelectionModel( final MamutAppModel appModel ) + private static SelectionModel< BranchSpot, BranchLink > branchSelectionModel( final ProjectModel appModel ) { final ModelGraph graph = appModel.getModel().getGraph(); final ModelBranchGraph branchGraph = appModel.getModel().getBranchGraph(); @@ -456,7 +456,7 @@ public boolean isSelectionTable() * Functions. */ - private static ViewGraph< Spot, Link, Spot, Link > createViewGraph( final MamutAppModel appModel ) + private static ViewGraph< Spot, Link, Spot, Link > createViewGraph( final ProjectModel appModel ) { return IdentityViewGraph.wrap( appModel.getModel().getGraph(), appModel.getModel().getGraphIdBimap() ); } diff --git a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java index 127b99310..251a752f8 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java @@ -109,12 +109,12 @@ public class MamutViewTrackScheme private final ColorBarOverlay colorBarOverlay; - public MamutViewTrackScheme( final MamutAppModel appModel ) + public MamutViewTrackScheme( final ProjectModel appModel ) { this( appModel, new HashMap<>() ); } - public MamutViewTrackScheme( final MamutAppModel appModel, final Map< String, Object > guiState ) + public MamutViewTrackScheme( final ProjectModel appModel, final Map< String, Object > guiState ) { super( appModel, new TrackSchemeGraph<>( diff --git a/src/main/java/org/mastodon/mamut/MamutAppModel.java b/src/main/java/org/mastodon/mamut/ProjectModel.java similarity index 97% rename from src/main/java/org/mastodon/mamut/MamutAppModel.java rename to src/main/java/org/mastodon/mamut/ProjectModel.java index d73866dde..1ef7f26f3 100644 --- a/src/main/java/org/mastodon/mamut/MamutAppModel.java +++ b/src/main/java/org/mastodon/mamut/ProjectModel.java @@ -57,12 +57,12 @@ import bdv.viewer.animate.MessageOverlayAnimator; /** - * Data class that stores the data model and the application model of the MaMuT + * Data class that stores the data model and the application model of the Mamut * application. * * @author Jean-Yves Tinevez */ -public class MamutAppModel extends MastodonAppModel< Model, Spot, Link > implements MastodonAppPluginModel +public class ProjectModel extends MastodonAppModel< Model, Spot, Link > implements MastodonAppPluginModel { private static final int NUM_GROUPS = 3; @@ -84,7 +84,7 @@ public class MamutAppModel extends MastodonAppModel< Model, Spot, Link > impleme private final MamutProject project; - public MamutAppModel( + public ProjectModel( final Context context, final Model model, final SharedBigDataViewerData sharedBdvData, diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index becbb231d..29dc66f15 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -172,7 +172,7 @@ public class WindowManager private final PreferencesDialog settings; - private final MamutAppModel appModel; + private final ProjectModel appModel; /** * Creates a new, empty WindowManager instance using the specified context. @@ -181,7 +181,7 @@ public class WindowManager * the context to use. Cannot be null. * @param globalActions */ - public WindowManager( final MamutAppModel appModel ) + public WindowManager( final ProjectModel appModel ) { this.appModel = appModel; this.trackSchemeStyleManager = new TrackSchemeStyleManager(); diff --git a/src/main/java/org/mastodon/mamut/io/ProjectActions.java b/src/main/java/org/mastodon/mamut/io/ProjectActions.java index 67c7c70d0..360645bcf 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectActions.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectActions.java @@ -3,7 +3,7 @@ import java.awt.Component; import java.awt.Frame; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.ui.keymap.CommandDescriptionProvider; import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; @@ -56,7 +56,7 @@ public static void installGlobalActions( final Actions actions, final Context co actions.namedAction( importMamutAction, IMPORT_MAMUT_KEYS ); } - public static void installAppActions( final Actions actions, final MamutAppModel appModel, final Frame parentComponent ) + public static void installAppActions( final Actions actions, final ProjectModel appModel, final Frame parentComponent ) { final RunnableAction saveProjectAction = new RunnableAction( SAVE_PROJECT, () -> ProjectSaver.saveProject( appModel, parentComponent ) ); final RunnableAction saveProjectAsAction = new RunnableAction( SAVE_PROJECT_AS, () -> ProjectSaver.saveProjectAs( appModel, parentComponent ) ); diff --git a/src/main/java/org/mastodon/mamut/io/ProjectCreator.java b/src/main/java/org/mastodon/mamut/io/ProjectCreator.java index 223278295..5fa145fdb 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectCreator.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectCreator.java @@ -14,7 +14,7 @@ import org.embl.mobie.io.ome.zarr.openers.OMEZarrS3Opener; import org.embl.mobie.io.util.S3Utils; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.ui.util.FileChooser; @@ -44,11 +44,11 @@ public class ProjectCreator * @param parentComponent * a component to use as parent to show dialogs during opening. * Can be null. - * @return a new {@link MamutAppModel} or null if the user + * @return a new {@link ProjectModel} or null if the user * clicked cancel, or if the BDV file is faulty and the user * declined to substitute a dummy dataset. */ - public static synchronized MamutAppModel createProjectWithDialog( final Context context, final Component parentComponent ) + public static synchronized ProjectModel createProjectWithDialog( final Context context, final Component parentComponent ) { final File file = FileChooser.chooseFile( parentComponent, @@ -88,12 +88,12 @@ public static synchronized MamutAppModel createProjectWithDialog( final Context * @param parentComponent * a component to use as parent to show dialogs during opening. * Can be null. - * @return a new {@link MamutAppModel}. + * @return a new {@link ProjectModel}. * @throws SpimDataException * if the BDV file that cannot be opened, and the user declined * to substitute a dummy dataset. */ - public static MamutAppModel createProjectFromBdvFile( final File file, final Context context, final Component parentComponent ) throws SpimDataException + public static ProjectModel createProjectFromBdvFile( final File file, final Context context, final Component parentComponent ) throws SpimDataException { final MamutProject project = MamutProjectIO.fromBdvFile( file ); try @@ -121,10 +121,10 @@ public static MamutAppModel createProjectFromBdvFile( final File file, final Con * @param parentComponent * a component to use as parent to show dialogs during opening. * Can be null. - * @return a new {@link MamutAppModel} or null if the user + * @return a new {@link ProjectModel} or null if the user * clicked cancel, or if the image data cannot be accessed. */ - public static synchronized MamutAppModel createProjectFromUrl( final Context context, final Component parentComponent ) + public static synchronized ProjectModel createProjectFromUrl( final Context context, final Component parentComponent ) { final String urlString = JOptionPane.showInputDialog( parentComponent, "Please input a url for image data" ); if ( urlString == null ) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectExporter.java b/src/main/java/org/mastodon/mamut/io/ProjectExporter.java index 481ff9d6d..eab99e9f2 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectExporter.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectExporter.java @@ -10,7 +10,7 @@ import javax.swing.JOptionPane; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.importer.trackmate.MamutExporter; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.ui.util.FileChooser; @@ -22,7 +22,7 @@ public class ProjectExporter { - public static synchronized void exportMamut( final MamutAppModel appModel, final Component parentComponent ) + public static synchronized void exportMamut( final ProjectModel appModel, final Component parentComponent ) { final MamutProject project = appModel.getProject(); final String filename = getProprosedMamutExportFileName( project ); diff --git a/src/main/java/org/mastodon/mamut/io/ProjectImporter.java b/src/main/java/org/mastodon/mamut/io/ProjectImporter.java index 4924f6c38..03aac64fc 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectImporter.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectImporter.java @@ -10,7 +10,7 @@ import javax.swing.JOptionPane; import org.mastodon.feature.FeatureSpecsService; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.importer.simi.SimiImportDialog; import org.mastodon.mamut.importer.tgmm.TgmmImportDialog; import org.mastodon.mamut.importer.trackmate.TrackMateImporter; @@ -34,10 +34,10 @@ public class ProjectImporter * a component used as parent for dialogs. * @param context * the current context. - * @return the loaded {@link MamutAppModel}, or null if the + * @return the loaded {@link ProjectModel}, or null if the * user cancels loading or if there is a problem reading the data. */ - public static synchronized MamutAppModel openMamutWithDialog( final Component parentComponent, final Context context ) + public static synchronized ProjectModel openMamutWithDialog( final Component parentComponent, final Context context ) { final File file = FileChooser.chooseFile( parentComponent, @@ -52,7 +52,7 @@ public static synchronized MamutAppModel openMamutWithDialog( final Component pa try { final TrackMateImporter importer = new TrackMateImporter( file ); - final MamutAppModel appModel = ProjectLoader.openWithDialog( importer.createProject(), context, parentComponent ); + final ProjectModel appModel = ProjectLoader.openWithDialog( importer.createProject(), context, parentComponent ); final FeatureSpecsService featureSpecsService = context.getService( FeatureSpecsService.class ); importer.readModel( appModel.getModel(), featureSpecsService ); return appModel; @@ -80,7 +80,7 @@ public static synchronized MamutAppModel openMamutWithDialog( final Component pa * @param parentComponent * a frame to use as parent for the dialog. */ - public static synchronized void importSimiDataWithDialog( final MamutAppModel appModel, final Frame parentComponent ) + public static synchronized void importSimiDataWithDialog( final ProjectModel appModel, final Frame parentComponent ) { final SimiImportDialog simiImportDialog = new SimiImportDialog( parentComponent ); simiImportDialog.showImportDialog( appModel.getSharedBdvData().getSpimData(), appModel.getModel() ); @@ -97,7 +97,7 @@ public static synchronized void importSimiDataWithDialog( final MamutAppModel ap * @param parentComponent * a frame to use as parent for the dialog. */ - public static synchronized void importTgmmDataWithDialog( final MamutAppModel appModel, final Frame parentComponent ) + public static synchronized void importTgmmDataWithDialog( final ProjectModel appModel, final Frame parentComponent ) { final TgmmImportDialog tgmmImportDialog = new TgmmImportDialog( parentComponent ); tgmmImportDialog.showImportDialog( appModel.getSharedBdvData().getSpimData(), appModel.getModel() ); diff --git a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java index 913b555b9..fc49cbcaf 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java @@ -18,7 +18,7 @@ import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; import org.mastodon.graph.io.RawGraphIO.FileIdToGraphMap; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.WindowManager; import org.mastodon.mamut.feature.MamutRawFeatureModelIO; import org.mastodon.mamut.io.project.MamutImagePlusProject; @@ -63,7 +63,7 @@ public class ProjectLoader * the object describing the project on disk. * @param context * the current context. - * @return the loaded {@link MamutAppModel}. + * @return the loaded {@link ProjectModel}. * @throws IOException * if the project points to a regular image file for image data, * and that file cannot be opened properly, or if there is a @@ -73,7 +73,7 @@ public class ProjectLoader * if the project points to a BDV file for image data, and that * BDV cannot be opened properly. */ - public static MamutAppModel open( final MamutProject project, final Context context ) throws IOException, SpimDataException + public static ProjectModel open( final MamutProject project, final Context context ) throws IOException, SpimDataException { return open( project, context, false, false ); } @@ -91,7 +91,7 @@ public static MamutAppModel open( final MamutProject project, final Context cont * if true, and if the image data cannot be loaded, * a dummy image data will be substituted. In that case a * {@link SpimDataException} is never thrown. - * @return the loaded {@link MamutAppModel}. + * @return the loaded {@link ProjectModel}. * @throws IOException * if the project points to a regular image file for image data, * and that file cannot be opened properly, or if there is a @@ -101,13 +101,13 @@ public static MamutAppModel open( final MamutProject project, final Context cont * if the project points to a BDV file for image data, and that * BDV cannot be opened properly. */ - public static MamutAppModel open( final MamutProject project, final Context context, final boolean restoreGUIState, final boolean authorizeSubstituteDummyData ) throws IOException, SpimDataException + public static ProjectModel open( final MamutProject project, final Context context, final boolean restoreGUIState, final boolean authorizeSubstituteDummyData ) throws IOException, SpimDataException { final SharedBigDataViewerData imageData = loadImageData( project, authorizeSubstituteDummyData ); final Model model = loadModel( project, context ); final KeyPressedManager keyPressedManager = new KeyPressedManager(); final KeymapManager keymapManager = new KeymapManager(); - final MamutAppModel appModel = new MamutAppModel( context, model, imageData, keyPressedManager, keymapManager, project ); + final ProjectModel appModel = new ProjectModel( context, model, imageData, keyPressedManager, keymapManager, project ); if ( restoreGUIState ) loadGUI( project, appModel.getWindowManager() ); @@ -129,7 +129,7 @@ public static MamutAppModel open( final MamutProject project, final Context cont * @param parentComponent * a component to use as parent to show dialogs during opening. * Can be null. - * @return the loaded {@link MamutAppModel}. + * @return the loaded {@link ProjectModel}. * @throws IOException * if the project points to a regular image file for image data, * and that file cannot be opened properly, or if there is a @@ -139,7 +139,7 @@ public static MamutAppModel open( final MamutProject project, final Context cont * if the project points to a BDV file that cannot be opened, * and the user declined to substitute a dummy dataset. */ - public static final MamutAppModel openWithDialog( final Context context, final Component parentComponent ) + public static final ProjectModel openWithDialog( final Context context, final Component parentComponent ) { String fn = null; if ( proposedProjectRoot != null ) @@ -189,7 +189,7 @@ else if ( project != null && project.getProjectRoot() != null ) * @param context * the current context. * - * @return the loaded {@link MamutAppModel}. + * @return the loaded {@link ProjectModel}. * @throws IOException * if the project points to a regular image file for image data, * and that file cannot be opened properly, or if there is a @@ -199,7 +199,7 @@ else if ( project != null && project.getProjectRoot() != null ) * if the project points to a BDV file that cannot be opened, * and the user declined to substitute a dummy dataset. */ - public static synchronized MamutAppModel openWithDialog( final MamutProject project, final Context context ) throws IOException, SpimDataException + public static synchronized ProjectModel openWithDialog( final MamutProject project, final Context context ) throws IOException, SpimDataException { return openWithDialog( project, context, null ); } @@ -229,9 +229,9 @@ public static synchronized MamutAppModel openWithDialog( final MamutProject proj * @throws SpimDataException * if the project points to a BDV file that cannot be opened, * and the user declined to substitute a dummy dataset. - * @return the loaded {@link MamutAppModel}. + * @return the loaded {@link ProjectModel}. */ - public static synchronized MamutAppModel openWithDialog( final MamutProject project, final Context context, final Component parentComponent ) throws IOException, SpimDataException + public static synchronized ProjectModel openWithDialog( final MamutProject project, final Context context, final Component parentComponent ) throws IOException, SpimDataException { try { diff --git a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java index 7f42e6b1c..7fe2ac361 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java @@ -27,7 +27,7 @@ import org.mastodon.app.MastodonIcons; import org.mastodon.graph.io.RawGraphIO.GraphToFileIdMap; import org.mastodon.mamut.MainWindow; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.WindowManager; import org.mastodon.mamut.feature.MamutRawFeatureModelIO; import org.mastodon.mamut.io.project.MamutImagePlusProject; @@ -64,7 +64,7 @@ public class ProjectSaver * a component to use as parent to show dialogs during opening. * Can be null. */ - public static synchronized void saveProjectAs( final MamutAppModel appModel, final Component parentComponent ) + public static synchronized void saveProjectAs( final ProjectModel appModel, final Component parentComponent ) { final MamutProject project = appModel.getProject(); final String projectRoot = getProposedProjectRoot( project ); @@ -186,7 +186,7 @@ public void run() * a component to use as parent to show dialogs during opening. * Can be null. */ - public static void saveProject( final MamutAppModel appModel, final Component parentComponent ) + public static void saveProject( final ProjectModel appModel, final Component parentComponent ) { try { @@ -215,7 +215,7 @@ public static void saveProject( final MamutAppModel appModel, final Component pa * @throws IOException * if there is an error writing to the file. */ - public static synchronized void saveProject( final File saveTo, final MamutAppModel appModel ) throws IOException + public static synchronized void saveProject( final File saveTo, final ProjectModel appModel ) throws IOException { // Current project. final MamutProject project = appModel.getProject(); @@ -300,7 +300,7 @@ static String stripExtensionIfPresent( final String fn, final String ext ) : fn; } - private static void saveAndReopenImagePlusProject( final MamutAppModel appModel, final Component parentComponent ) throws IOException + private static void saveAndReopenImagePlusProject( final ProjectModel appModel, final Component parentComponent ) throws IOException { final MamutImagePlusProject project = ( MamutImagePlusProject ) appModel.getProject(); @@ -356,7 +356,7 @@ public void windowClosing( final java.awt.event.WindowEvent e ) final Model model = appModel.getModel(); final KeyPressedManager keyPressedManager = new KeyPressedManager(); final KeymapManager keymapManager = new KeymapManager(); - final MamutAppModel nmam = new MamutAppModel( context, model, sbdv, keyPressedManager, keymapManager, np ); + final ProjectModel nmam = new ProjectModel( context, model, sbdv, keyPressedManager, keymapManager, np ); // Close the old one. appModel.close(); diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java index 2048d3384..a74a08f00 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java @@ -32,7 +32,7 @@ import java.util.ArrayList; import org.mastodon.mamut.MainWindow; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; @@ -79,7 +79,7 @@ public Object open( final Location source ) throws IOException try { final MamutProject project = MamutProjectIO.load( projectPath ); - final MamutAppModel appModel = ProjectLoader.openWithDialog( project, getContext(), null ); + final ProjectModel appModel = ProjectLoader.openWithDialog( project, getContext(), null ); final MainWindow mainWindow = new MainWindow( appModel ); mainWindow.setVisible( true ); } diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java index 433b21d7c..c590f39d7 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java @@ -54,7 +54,7 @@ import org.mastodon.app.MastodonIcons; import org.mastodon.feature.FeatureSpecsService; import org.mastodon.mamut.MainWindow; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.importer.simi.SimiImporter; import org.mastodon.mamut.importer.simi.SimiImporter.LabelFunction; import org.mastodon.mamut.importer.tgmm.TgmmImporter; @@ -142,7 +142,7 @@ private void importSimi() // Create new blank project from BDV file. final File bdvFile = new File( gui.importSimiBioCellPanel.textAreaBDVFile.getText() ); final MamutProject project = MamutProjectIO.fromBdvFile( bdvFile ); - final MamutAppModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectLoader.open( project, context ); final Model model = appModel.getModel(); final AbstractSpimData< ? > spimData = appModel.getSharedBdvData().getSpimData(); @@ -246,7 +246,7 @@ private void importTgmm() // Create new blank project from BDV file. final File bdvFile = new File( gui.importTGMMPanel.textAreaBDVFile.getText() ); final MamutProject project = MamutProjectIO.fromBdvFile( bdvFile ); - final MamutAppModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectLoader.open( project, context ); final Model model = appModel.getModel(); final AbstractSpimData< ? > spimData = appModel.getSharedBdvData().getSpimData(); @@ -351,7 +351,7 @@ private void createNewProject() new Thread( () -> { try { - final MamutAppModel appModel = ProjectCreator.createProjectFromBdvFile( file, context, gui ); + final ProjectModel appModel = ProjectCreator.createProjectFromBdvFile( file, context, gui ); new MainWindow( appModel ).setVisible( true ); dispose(); } @@ -386,7 +386,7 @@ private void createNewProject() try { final MamutProject project = MamutProjectIO.fromImagePlus( imp ); - final MamutAppModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectLoader.open( project, context ); final MainWindow mainWindow = new MainWindow( appModel ); /* @@ -551,7 +551,7 @@ private void createProjectFromURL() * Open it as a new Mastodon project. */ final MamutProject project = MamutProjectIO.fromBdvFile( file ); - final MamutAppModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectLoader.open( project, context ); new MainWindow( appModel ).setVisible( true ); /* @@ -599,7 +599,7 @@ private void importMaMuT() final TrackMateImporter importer = new TrackMateImporter( file ); final MamutProject project = importer.createProject(); - final MamutAppModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectLoader.open( project, context ); final FeatureSpecsService featureSpecsService = context.getService( FeatureSpecsService.class ); importer.readModel( appModel.getModel(), featureSpecsService ); @@ -656,7 +656,7 @@ private void loadMastodonProject( final String projectPath ) try { final MamutProject project = MamutProjectIO.load( file.getAbsolutePath() ); - final MamutAppModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectLoader.open( project, context ); new MainWindow( appModel ).setVisible( true ); dispose(); diff --git a/src/main/java/org/mastodon/mamut/plugin/MamutPlugin.java b/src/main/java/org/mastodon/mamut/plugin/MamutPlugin.java index a3d6b5977..197c8cf7e 100644 --- a/src/main/java/org/mastodon/mamut/plugin/MamutPlugin.java +++ b/src/main/java/org/mastodon/mamut/plugin/MamutPlugin.java @@ -29,7 +29,7 @@ package org.mastodon.mamut.plugin; import org.mastodon.app.plugin.MastodonPlugin; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; -public interface MamutPlugin extends MastodonPlugin< MamutAppModel > +public interface MamutPlugin extends MastodonPlugin< ProjectModel > {} diff --git a/src/main/java/org/mastodon/mamut/plugin/MamutPlugins.java b/src/main/java/org/mastodon/mamut/plugin/MamutPlugins.java index 4138f22f1..6a17150d2 100644 --- a/src/main/java/org/mastodon/mamut/plugin/MamutPlugins.java +++ b/src/main/java/org/mastodon/mamut/plugin/MamutPlugins.java @@ -29,10 +29,10 @@ package org.mastodon.mamut.plugin; import org.mastodon.app.plugin.MastodonPlugins; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.ui.keymap.Keymap; -public class MamutPlugins extends MastodonPlugins< MamutPlugin, MamutAppModel > +public class MamutPlugins extends MastodonPlugins< MamutPlugin, ProjectModel > { public MamutPlugins( final Keymap keymap ) diff --git a/src/main/java/org/mastodon/mamut/plugin/MamutTestPlugin.java b/src/main/java/org/mastodon/mamut/plugin/MamutTestPlugin.java index a4a5fc741..b2e6fe406 100644 --- a/src/main/java/org/mastodon/mamut/plugin/MamutTestPlugin.java +++ b/src/main/java/org/mastodon/mamut/plugin/MamutTestPlugin.java @@ -35,7 +35,7 @@ import java.util.Map; import org.mastodon.app.ui.ViewMenuBuilder; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.MamutMenuBuilder; import org.mastodon.ui.keymap.CommandDescriptionProvider; import org.mastodon.ui.keymap.CommandDescriptions; @@ -107,6 +107,6 @@ public void installGlobalActions( final Actions actions ) } @Override - public void setAppPluginModel( final MamutAppModel appModel ) + public void setAppPluginModel( final ProjectModel appModel ) {} } diff --git a/src/test/java/org/mastodon/StartMastodonOnProject.java b/src/test/java/org/mastodon/StartMastodonOnProject.java index 014345bf0..35d438cae 100644 --- a/src/test/java/org/mastodon/StartMastodonOnProject.java +++ b/src/test/java/org/mastodon/StartMastodonOnProject.java @@ -36,7 +36,7 @@ import javax.swing.filechooser.FileNameExtensionFilter; import org.mastodon.mamut.MainWindow; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.Context; @@ -62,7 +62,7 @@ public static void launch( final String projectPath ) try { System.setProperty( "apple.laf.useScreenMenuBar", "true" ); - final MamutAppModel appModel = ProjectLoader.open( MamutProjectIO.load( projectPath ), new Context() ); + final ProjectModel appModel = ProjectLoader.open( MamutProjectIO.load( projectPath ), new Context() ); final MainWindow win = new MainWindow( appModel ); win.setVisible( true ); win.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); diff --git a/src/test/java/org/mastodon/graph/BranchGraphExample.java b/src/test/java/org/mastodon/graph/BranchGraphExample.java index 0d34c4029..554455a2b 100644 --- a/src/test/java/org/mastodon/graph/BranchGraphExample.java +++ b/src/test/java/org/mastodon/graph/BranchGraphExample.java @@ -35,7 +35,7 @@ import javax.swing.UnsupportedLookAndFeelException; import org.mastodon.mamut.MainWindow; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; @@ -53,7 +53,7 @@ public static void main( final String[] args ) throws IOException // final String projectPath = "samples/mette_e1.mastodon"; // final String projectPath = "samples/mette_e1_small.mastodon"; final MamutProject project = MamutProjectIO.load( projectPath ); - final MamutAppModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectLoader.open( project, context ); new MainWindow( appModel ).setVisible( true ); } catch ( final Exception e1 ) diff --git a/src/test/java/org/mastodon/mamut/CloseListenerTest.java b/src/test/java/org/mastodon/mamut/CloseListenerTest.java index 310beeee0..bc0998008 100644 --- a/src/test/java/org/mastodon/mamut/CloseListenerTest.java +++ b/src/test/java/org/mastodon/mamut/CloseListenerTest.java @@ -56,7 +56,7 @@ public void testCloseListeners() throws IOException, SpimDataException try (Context context = new Context()) { // setup - final MamutAppModel appModel = openTinyProject( context ); + final ProjectModel appModel = openTinyProject( context ); final int[] counter = new int[] { 0 }; appModel.projectClosedListeners().add( () -> counter[ 0 ]++ ); // process @@ -67,11 +67,11 @@ public void testCloseListeners() throws IOException, SpimDataException } } - private static MamutAppModel openTinyProject( final Context context ) throws IOException, SpimDataException + private static ProjectModel openTinyProject( final Context context ) throws IOException, SpimDataException { final String tinyProjectFile = CloseListenerTest.class.getResource( "/org/mastodon/mamut/examples/tiny/tiny-project.mastodon" ).getFile(); final MamutProject project = MamutProjectIO.load( tinyProjectFile ); - final MamutAppModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectLoader.open( project, context ); return appModel; } } diff --git a/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java b/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java index 82148aea0..32aeb36c1 100644 --- a/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java +++ b/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java @@ -95,7 +95,7 @@ static WeakReference< ModelGraph > openAndCloseMastodon( final Context context ) try { final MamutProject project = MamutProjectIO.load( exampleProject ); - final MamutAppModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectLoader.open( project, context ); final MainWindow mainWindow = new MainWindow( appModel ); mainWindow.setVisible( true ); diff --git a/src/test/java/org/mastodon/mamut/MamutPlayground.java b/src/test/java/org/mastodon/mamut/MamutPlayground.java index ae09ad51a..f80112b0f 100644 --- a/src/test/java/org/mastodon/mamut/MamutPlayground.java +++ b/src/test/java/org/mastodon/mamut/MamutPlayground.java @@ -57,7 +57,7 @@ public static void main( final String[] args ) throws IOException, SpimDataExcep { final Context context = new Context(); final MamutProject project = MamutProjectIO.load( "samples/mamutproject.mastodon" ); - final MamutAppModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectLoader.open( project, context ); final Model model = appModel.getModel(); System.out.println( "\n\n\n___________________________________\nData loaded.\n" ); diff --git a/src/test/java/org/mastodon/mamut/ProjectManagerTest.java b/src/test/java/org/mastodon/mamut/ProjectManagerTest.java index 96632349e..f228cf0d4 100644 --- a/src/test/java/org/mastodon/mamut/ProjectManagerTest.java +++ b/src/test/java/org/mastodon/mamut/ProjectManagerTest.java @@ -98,7 +98,7 @@ private void openAndSaveMastodonProject( final Path open, final Path save ) throws IOException, SpimDataException { final MamutProject project = MamutProjectIO.load( open.toFile().getAbsolutePath() ); - final MamutAppModel appModel = ProjectLoader.open( project, context, false, true ); + final ProjectModel appModel = ProjectLoader.open( project, context, false, true ); ProjectSaver.saveProject( save.toFile(), appModel ); } diff --git a/src/test/java/org/mastodon/mamut/StartMastodonWithMissingImageDemo.java b/src/test/java/org/mastodon/mamut/StartMastodonWithMissingImageDemo.java index bebd06cca..f823d1f09 100644 --- a/src/test/java/org/mastodon/mamut/StartMastodonWithMissingImageDemo.java +++ b/src/test/java/org/mastodon/mamut/StartMastodonWithMissingImageDemo.java @@ -74,7 +74,7 @@ private void openProjectFromResources( final String resourceName ) try { System.setProperty( "apple.laf.useScreenMenuBar", "true" ); - final MamutAppModel appModel = ProjectLoader.open( MamutProjectIO.load( file ), new Context() ); + final ProjectModel appModel = ProjectLoader.open( MamutProjectIO.load( file ), new Context() ); final MainWindow win = new MainWindow( appModel ); win.setVisible( true ); diff --git a/src/test/java/org/mastodon/mamut/feature/RawDeserializationExample.java b/src/test/java/org/mastodon/mamut/feature/RawDeserializationExample.java index d30bf4343..ff19c3a45 100644 --- a/src/test/java/org/mastodon/mamut/feature/RawDeserializationExample.java +++ b/src/test/java/org/mastodon/mamut/feature/RawDeserializationExample.java @@ -43,7 +43,7 @@ import org.mastodon.feature.Feature; import org.mastodon.feature.FeatureModel; import org.mastodon.feature.FeatureSpec; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.ProjectSaver; import org.mastodon.mamut.io.project.MamutProject; @@ -65,7 +65,7 @@ public static void main( final String[] args ) throws ClassNotFoundException, In // Load project. final MamutProject project = MamutProjectIO.load( "samples/mamutproject.mastodon" ); - final MamutAppModel appModel = ProjectLoader.open( project, new Context() ); + final ProjectModel appModel = ProjectLoader.open( project, new Context() ); final Model model = appModel.getModel(); final FeatureModel featureModel = model.getFeatureModel(); diff --git a/src/test/java/org/mastodon/mamut/feature/SerializeFeatureExample.java b/src/test/java/org/mastodon/mamut/feature/SerializeFeatureExample.java index 8a2b32fbd..126586849 100644 --- a/src/test/java/org/mastodon/mamut/feature/SerializeFeatureExample.java +++ b/src/test/java/org/mastodon/mamut/feature/SerializeFeatureExample.java @@ -39,7 +39,7 @@ import org.mastodon.feature.Feature; import org.mastodon.feature.FeatureModel; import org.mastodon.feature.FeatureSpec; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.ProjectSaver; import org.mastodon.mamut.io.project.MamutProject; @@ -62,7 +62,7 @@ public static void main( final String[] args ) throws ClassNotFoundException, In // Load project. final MamutProject project = MamutProjectIO.load( "samples/mamutproject.mastodon" ); - final MamutAppModel appModel = ProjectLoader.open( project, new Context() ); + final ProjectModel appModel = ProjectLoader.open( project, new Context() ); final Model model = appModel.getModel(); final FeatureModel featureModel = model.getFeatureModel(); @@ -88,7 +88,7 @@ public static void main( final String[] args ) throws ClassNotFoundException, In System.out.println( "\nReloading." ); final MamutProject project2 = MamutProjectIO.load( targetFile.getAbsolutePath() ); - final MamutAppModel appModel2 = ProjectLoader.open( project2, appModel.getContext() ); + final ProjectModel appModel2 = ProjectLoader.open( project2, appModel.getContext() ); System.out.println( "Done." ); System.out.println( "\n" + ModelUtils.dump( appModel2.getModel(), 4 ) ); diff --git a/src/test/java/org/mastodon/mamut/feature/SpotIntensityBenchmark.java b/src/test/java/org/mastodon/mamut/feature/SpotIntensityBenchmark.java index b94702a4f..b725f5920 100644 --- a/src/test/java/org/mastodon/mamut/feature/SpotIntensityBenchmark.java +++ b/src/test/java/org/mastodon/mamut/feature/SpotIntensityBenchmark.java @@ -31,7 +31,7 @@ import java.io.IOException; import org.jdom2.JDOMException; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; @@ -52,7 +52,7 @@ public static void main( final String[] args ) throws IOException, JDOMException */ final MamutProject project = MamutProjectIO.load( "/Users/tinevez/Projects/JYTinevez/MaMuT/Mastodon-dataset/MaMuT_Parhyale_demo.mastodon" ); - final MamutAppModel appModel = ProjectLoader.open( project, new Context() ); + final ProjectModel appModel = ProjectLoader.open( project, new Context() ); final Model model = appModel.getModel(); // Just keep the 1st time-point, or else.... diff --git a/src/test/java/org/mastodon/mamut/feature/SpotIntensityUpdateExample.java b/src/test/java/org/mastodon/mamut/feature/SpotIntensityUpdateExample.java index 048051bb2..e6474841b 100644 --- a/src/test/java/org/mastodon/mamut/feature/SpotIntensityUpdateExample.java +++ b/src/test/java/org/mastodon/mamut/feature/SpotIntensityUpdateExample.java @@ -38,7 +38,7 @@ import org.mastodon.feature.FeatureModel; import org.mastodon.feature.FeatureProjection; import org.mastodon.feature.FeatureSpec; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; @@ -59,7 +59,7 @@ public static void main( final String[] args ) throws IOException, JDOMException */ final MamutProject project = MamutProjectIO.load( "samples/mamutproject.mastodon" ); - final MamutAppModel appModel = ProjectLoader.open( project, new Context() ); + final ProjectModel appModel = ProjectLoader.open( project, new Context() ); final Model model = appModel.getModel(); final FeatureModel featureModel = model.getFeatureModel(); diff --git a/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java b/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java index 813b46102..56c9fda1d 100644 --- a/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java +++ b/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java @@ -39,7 +39,7 @@ import org.mastodon.feature.FeatureModel; import org.mastodon.feature.FeatureProjection; import org.mastodon.feature.FeatureSpec; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.feature.MamutFeatureComputerService; import org.mastodon.mamut.feature.TrackSizeFeature; import org.mastodon.mamut.importer.trackmate.MamutExporter; @@ -63,7 +63,7 @@ public static void main( final String[] args ) throws IOException, JDOMException */ final MamutProject project = MamutProjectIO.load( "samples/mamutproject.mastodon" ); - final MamutAppModel appModel = ProjectLoader.open( project, new Context() ); + final ProjectModel appModel = ProjectLoader.open( project, new Context() ); final Model model = appModel.getModel(); final FeatureModel featureModel = model.getFeatureModel(); diff --git a/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java b/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java index 57e9bac3d..cbbf814ce 100644 --- a/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java +++ b/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java @@ -36,7 +36,7 @@ import javax.swing.UnsupportedLookAndFeelException; import org.mastodon.feature.FeatureSpecsService; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.importer.trackmate.TrackMateImporter; import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.ProjectSaver; @@ -69,7 +69,7 @@ private static void importFromMaMuTAndSave( final File mamutFile, final File tar { final Context context = new Context(); final TrackMateImporter importer = new TrackMateImporter( mamutFile ); - final MamutAppModel appModel = ProjectLoader.open( importer.createProject(), context ); + final ProjectModel appModel = ProjectLoader.open( importer.createProject(), context ); final FeatureSpecsService featureSpecsService = context.getService( FeatureSpecsService.class ); importer.readModel( appModel.getModel(), featureSpecsService ); ProjectSaver.saveProject( targetMastodonFile, appModel ); @@ -77,7 +77,7 @@ private static void importFromMaMuTAndSave( final File mamutFile, final File tar private static void reloadAfterSave( final File targetMastodonFile ) throws IOException, SpimDataException { - final MamutAppModel appModel = ProjectLoader.open( MamutProjectIO.load( targetMastodonFile.getAbsolutePath() ), new Context() ); + final ProjectModel appModel = ProjectLoader.open( MamutProjectIO.load( targetMastodonFile.getAbsolutePath() ), new Context() ); final Model model = appModel.getModel(); System.out.println( "After reloading the saved MaMuT import:" ); System.out.println( ModelUtils.dump( model, 5 ) ); diff --git a/src/test/java/org/mastodon/mamut/tags/PlayingWithTagsExample.java b/src/test/java/org/mastodon/mamut/tags/PlayingWithTagsExample.java index ce9727a7a..4859b98d2 100644 --- a/src/test/java/org/mastodon/mamut/tags/PlayingWithTagsExample.java +++ b/src/test/java/org/mastodon/mamut/tags/PlayingWithTagsExample.java @@ -3,7 +3,7 @@ import java.io.IOException; import java.util.Collection; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Link; @@ -23,7 +23,7 @@ public class PlayingWithTagsExample public static void main( final String[] args ) throws IOException, SpimDataException { - final MamutAppModel appModel = ProjectLoader.open( MamutProjectIO.load( "/Users/tinevez/Development/MastodonWS/mastodon/samples/drosophila_crop.mastodon" ), new Context() ); + final ProjectModel appModel = ProjectLoader.open( MamutProjectIO.load( "/Users/tinevez/Development/MastodonWS/mastodon/samples/drosophila_crop.mastodon" ), new Context() ); final Model model = appModel.getModel(); final TagSetModel< Spot, Link > tsm = model.getTagSetModel(); diff --git a/src/test/java/org/mastodon/util/MastodonUtils.java b/src/test/java/org/mastodon/util/MastodonUtils.java index b0f16f42b..09061dd2e 100644 --- a/src/test/java/org/mastodon/util/MastodonUtils.java +++ b/src/test/java/org/mastodon/util/MastodonUtils.java @@ -35,7 +35,7 @@ import org.mastodon.graph.io.RawGraphIO; import org.mastodon.grouping.GroupHandle; import org.mastodon.mamut.MainWindow; -import org.mastodon.mamut.MamutAppModel; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.WindowManager; import org.mastodon.mamut.feature.MamutRawFeatureModelIO; import org.mastodon.mamut.io.ProjectLoader; @@ -96,7 +96,7 @@ public static WindowManager showGui( final String projectPath ) { try { - final MamutAppModel appModel = ProjectLoader.open( MamutProjectIO.load( projectPath ), new Context() ); + final ProjectModel appModel = ProjectLoader.open( MamutProjectIO.load( projectPath ), new Context() ); final MainWindow mainWindow = new MainWindow( appModel ); mainWindow.setVisible( true ); mainWindow.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); @@ -108,7 +108,7 @@ public static WindowManager showGui( final String projectPath ) } } - public static void logMastodonEvents( final MamutAppModel appModel ) + public static void logMastodonEvents( final ProjectModel appModel ) { final GroupHandle groupHandle = appModel.getGroupManager().createGroupHandle(); groupHandle.setGroupId( 0 ); @@ -118,7 +118,7 @@ public static void logMastodonEvents( final MamutAppModel appModel ) logTagSetModel( appModel ); } - private static void logFocusModel( final MamutAppModel appModel ) + private static void logFocusModel( final ProjectModel appModel ) { final FocusModel< Spot, Link > focusModel = appModel.getFocusModel(); final ModelGraph graph = appModel.getModel().getGraph(); @@ -153,7 +153,7 @@ private static void logTimePointModel( final TimepointModel model ) model.listeners().add( () -> log( "Time point changed: (to " + model.getTimepoint() + ")" ) ); } - private static void logTagSetModel( final MamutAppModel appModel ) + private static void logTagSetModel( final ProjectModel appModel ) { // TODO final Model model = appModel.getModel(); From 4b9a6ce2cddc058630aad54882a983b25592f37c Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 17 Aug 2023 13:10:31 +0200 Subject: [PATCH 010/220] Fix deprecation of addTimePointListeners() --- src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java index b1d60c4d2..8229c2e1f 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java @@ -209,7 +209,7 @@ public MamutBranchViewBdv( final ProjectModel appModel, final Map< String, Objec viewer.getDisplay().overlays().add( tracksOverlay ); viewer.renderTransformListeners().add( tracksOverlay ); - viewer.addTimePointListener( tracksOverlay ); + viewer.timePointListeners().add( tracksOverlay ); // Core graph. final Model model = appModel.getModel(); @@ -264,7 +264,7 @@ public MamutBranchViewBdv( final ProjectModel appModel, final Map< String, Objec viewer.getTransformEventHandler().install( viewBehaviours ); // Time-point listener. - viewer.addTimePointListener( timePointIndex -> timepointModel.setTimepoint( timePointIndex ) ); + viewer.timePointListeners().add( timePointIndex -> timepointModel.setTimepoint( timePointIndex ) ); timepointModel.listeners().add( () -> viewer.setTimepoint( timepointModel.getTimepoint() ) ); // Render settings. From 834644eb6495564ff02cccce80dfb1027f46b349 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 17 Aug 2023 13:11:26 +0200 Subject: [PATCH 011/220] Fix depracation warnings with some YAML constructors. They will generate an error in v2.0. --- .../java/org/mastodon/io/yaml/WorkaroundConstructor.java | 3 ++- .../java/org/mastodon/io/yaml/WorkaroundRepresenter.java | 6 ++++++ src/main/java/org/mastodon/ui/keymap/KeymapManager.java | 5 +++-- src/main/java/org/mastodon/util/MastodonDebugSettings.java | 5 +++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/mastodon/io/yaml/WorkaroundConstructor.java b/src/main/java/org/mastodon/io/yaml/WorkaroundConstructor.java index d4cacae3c..cf5be2302 100644 --- a/src/main/java/org/mastodon/io/yaml/WorkaroundConstructor.java +++ b/src/main/java/org/mastodon/io/yaml/WorkaroundConstructor.java @@ -31,6 +31,7 @@ import java.util.List; import java.util.Map; +import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.constructor.Constructor; import org.yaml.snakeyaml.nodes.MappingNode; import org.yaml.snakeyaml.nodes.SequenceNode; @@ -39,7 +40,7 @@ public class WorkaroundConstructor extends Constructor { public WorkaroundConstructor( final Class< ? > theRoot ) { - super( theRoot ); + super( theRoot, new LoaderOptions() ); } @Override diff --git a/src/main/java/org/mastodon/io/yaml/WorkaroundRepresenter.java b/src/main/java/org/mastodon/io/yaml/WorkaroundRepresenter.java index 3c7c64ffe..682941b5d 100644 --- a/src/main/java/org/mastodon/io/yaml/WorkaroundRepresenter.java +++ b/src/main/java/org/mastodon/io/yaml/WorkaroundRepresenter.java @@ -30,6 +30,7 @@ import java.util.Map; +import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.DumperOptions.FlowStyle; import org.yaml.snakeyaml.nodes.Node; import org.yaml.snakeyaml.nodes.Tag; @@ -37,6 +38,11 @@ public class WorkaroundRepresenter extends Representer { + public WorkaroundRepresenter() + { + super( new DumperOptions() ); + } + @Override protected Node representSequence( final Tag tag, final Iterable< ? > sequence, final FlowStyle flowStyle ) { diff --git a/src/main/java/org/mastodon/ui/keymap/KeymapManager.java b/src/main/java/org/mastodon/ui/keymap/KeymapManager.java index 2d9fb7301..255b347d8 100644 --- a/src/main/java/org/mastodon/ui/keymap/KeymapManager.java +++ b/src/main/java/org/mastodon/ui/keymap/KeymapManager.java @@ -46,6 +46,7 @@ import org.scijava.ui.behaviour.io.InputTriggerDescriptionsBuilder; import org.scijava.ui.behaviour.io.yaml.YamlConfigIO; import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.TypeDescription; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.constructor.Constructor; @@ -229,9 +230,9 @@ private static Yaml createYaml() { final DumperOptions dumperOptions = new DumperOptions(); dumperOptions.setDefaultFlowStyle( DumperOptions.FlowStyle.BLOCK ); - final Representer representer = new Representer(); + final Representer representer = new Representer( dumperOptions ); representer.addClassTag( KeymapsListIO.class, new Tag( "!keymapslist" ) ); - final Constructor constructor = new Constructor(); + final Constructor constructor = new Constructor( new LoaderOptions() ); constructor.addTypeDescription( new TypeDescription( KeymapsListIO.class, "!keymapslist" ) ); return new Yaml( constructor, representer, dumperOptions ); } diff --git a/src/main/java/org/mastodon/util/MastodonDebugSettings.java b/src/main/java/org/mastodon/util/MastodonDebugSettings.java index 452ee7a5b..ef4424c65 100644 --- a/src/main/java/org/mastodon/util/MastodonDebugSettings.java +++ b/src/main/java/org/mastodon/util/MastodonDebugSettings.java @@ -35,6 +35,7 @@ import java.io.IOException; import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.TypeDescription; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.constructor.Constructor; @@ -143,9 +144,9 @@ private static Yaml createYaml() { final DumperOptions dumperOptions = new DumperOptions(); dumperOptions.setDefaultFlowStyle( DumperOptions.FlowStyle.BLOCK ); - final Representer representer = new Representer(); + final Representer representer = new Representer( dumperOptions ); representer.addClassTag( DebugSettingsImpl.class, new Tag( "!debugsettings" ) ); - final Constructor constructor = new Constructor(); + final Constructor constructor = new Constructor( new LoaderOptions() ); constructor.addTypeDescription( new TypeDescription( DebugSettingsImpl.class, "!debugsettings" ) ); return new Yaml( constructor, representer, dumperOptions ); } From ea3908d0757e3d8f495bfc1bd79a40a5afbce06d Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 17 Aug 2023 15:39:24 +0200 Subject: [PATCH 012/220] Remove the use of deprecated BDV classes. This commit removes mention of the deprecated SetupAssignments and BrightnessDialog classes. The actions that brought the corresponding dialogs are removed as well. There is some code to still make it possible to save/load bdv settings and use ones that are generated 'elsewhere'. --- .../org/mastodon/mamut/io/ProjectSaver.java | 4 +- .../views/bdv/BigDataViewerActionsMamut.java | 19 --- .../views/bdv/BigDataViewerMamut.java | 24 +-- .../views/bdv/SharedBigDataViewerData.java | 152 ++++++++++++------ 4 files changed, 107 insertions(+), 92 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java index 7fe2ac361..3de74b7a8 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java @@ -318,9 +318,7 @@ private static void saveAndReopenImagePlusProject( final ProjectModel appModel, final Element root = new Element( "Settings" ); final SharedBigDataViewerData sbdv = appModel.getSharedBdvData(); root.addContent( sbdv.getManualTransformation().toXml() ); - @SuppressWarnings( "deprecation" ) - final Element setupAssignmentsXml = sbdv.getSetupAssignments().toXml(); - root.addContent( setupAssignmentsXml ); + root.addContent( sbdv.toXmlSetupAssignments() ); root.addContent( sbdv.getBookmarks().toXml() ); final Document doc = new Document( root ); final XMLOutputter xout = new XMLOutputter( Format.getPrettyFormat() ); diff --git a/src/main/java/org/mastodon/views/bdv/BigDataViewerActionsMamut.java b/src/main/java/org/mastodon/views/bdv/BigDataViewerActionsMamut.java index 473d32cbd..b62dc7b08 100644 --- a/src/main/java/org/mastodon/views/bdv/BigDataViewerActionsMamut.java +++ b/src/main/java/org/mastodon/views/bdv/BigDataViewerActionsMamut.java @@ -28,8 +28,6 @@ */ package org.mastodon.views.bdv; -import static bdv.BigDataViewerActions.BRIGHTNESS_SETTINGS; -import static bdv.BigDataViewerActions.BRIGHTNESS_SETTINGS_KEYS; import static bdv.BigDataViewerActions.COLLAPSE_CARDS; import static bdv.BigDataViewerActions.COLLAPSE_CARDS_KEYS; import static bdv.BigDataViewerActions.EXPAND_CARDS; @@ -44,8 +42,6 @@ import static bdv.BigDataViewerActions.SAVE_SETTINGS_KEYS; import static bdv.BigDataViewerActions.SET_BOOKMARK; import static bdv.BigDataViewerActions.SET_BOOKMARK_KEYS; -import static bdv.BigDataViewerActions.VISIBILITY_AND_GROUPING; -import static bdv.BigDataViewerActions.VISIBILITY_AND_GROUPING_KEYS; import org.mastodon.ui.keymap.CommandDescriptionProvider; import org.mastodon.ui.keymap.CommandDescriptions; @@ -71,13 +67,10 @@ public Descriptions() @Override public void getCommandDescriptions( final CommandDescriptions descriptions ) { - descriptions.add( VISIBILITY_AND_GROUPING, VISIBILITY_AND_GROUPING_KEYS, - "Show the Visibility&Grouping dialog." ); descriptions.add( SET_BOOKMARK, SET_BOOKMARK_KEYS, "Set a labeled bookmark at the current location." ); descriptions.add( GO_TO_BOOKMARK, GO_TO_BOOKMARK_KEYS, "Retrieve a labeled bookmark location." ); descriptions.add( GO_TO_BOOKMARK_ROTATION, GO_TO_BOOKMARK_ROTATION_KEYS, "Retrieve a labeled bookmark, set only the orientation." ); - descriptions.add( BRIGHTNESS_SETTINGS, BRIGHTNESS_SETTINGS_KEYS, "Show the Brightness&Colors dialog." ); descriptions.add( SAVE_SETTINGS, SAVE_SETTINGS_KEYS, "Save the BigDataViewer settings to a settings.xml file." ); descriptions.add( LOAD_SETTINGS, LOAD_SETTINGS_KEYS, @@ -100,19 +93,7 @@ public static void install( final Actions actions, final BigDataViewerMamut bdv ) { - BigDataViewerActions.toggleDialogAction( actions, bdv.getVisibilityAndGroupingDialog(), VISIBILITY_AND_GROUPING, - VISIBILITY_AND_GROUPING_KEYS ); BigDataViewerActions.bookmarks( actions, bdv.getBookmarksEditor() ); - - /* - * TODO: move to app actions - * - * This requires modifications in bigdataviewer-core: The group setup - * should be shared between multiple windows. - */ - BigDataViewerActions.toggleDialogAction( actions, bdv.getBrightnessDialog(), BRIGHTNESS_SETTINGS, - BRIGHTNESS_SETTINGS_KEYS ); - actions.runnableAction( bdv::saveSettings, SAVE_SETTINGS, SAVE_SETTINGS_KEYS ); actions.runnableAction( bdv::loadSettings, LOAD_SETTINGS, LOAD_SETTINGS_KEYS ); diff --git a/src/main/java/org/mastodon/views/bdv/BigDataViewerMamut.java b/src/main/java/org/mastodon/views/bdv/BigDataViewerMamut.java index 578935e2d..27cd66ad3 100644 --- a/src/main/java/org/mastodon/views/bdv/BigDataViewerMamut.java +++ b/src/main/java/org/mastodon/views/bdv/BigDataViewerMamut.java @@ -28,8 +28,6 @@ */ package org.mastodon.views.bdv; -import bdv.ui.splitpanel.SplitPanel; -import bdv.viewer.ViewerPanel; import java.io.File; import java.io.IOException; import java.util.Arrays; @@ -39,9 +37,9 @@ import org.mastodon.grouping.GroupHandle; -import bdv.tools.VisibilityAndGroupingDialog; import bdv.tools.bookmarks.BookmarksEditor; -import bdv.tools.brightness.BrightnessDialog; +import bdv.ui.splitpanel.SplitPanel; +import bdv.viewer.ViewerPanel; public class BigDataViewerMamut { @@ -51,10 +49,6 @@ public class BigDataViewerMamut private final SplitPanel splitPanel; - private final BrightnessDialog brightnessDialog; - - private final VisibilityAndGroupingDialog visibilityAndGroupingDialog; - private final BookmarksEditor bookmarkEditor; private final JFileChooser fileChooser; @@ -119,9 +113,6 @@ public boolean accept( final File f ) bookmarkEditor = new BookmarksEditor( viewer, viewerFrame.getKeybindings(), shared.getBookmarks() ); bookmarkEditor.setInputMapsToBlock( Arrays.asList( "all" ) ); - - brightnessDialog = shared.getBrightnessDialog(); - visibilityAndGroupingDialog = new VisibilityAndGroupingDialog( viewerFrame, viewer.getVisibilityAndGrouping() ); } public ViewerPanel getViewer() @@ -134,16 +125,6 @@ public ViewerFrameMamut getViewerFrame() return viewerFrame; } - public BrightnessDialog getBrightnessDialog() - { - return brightnessDialog; - } - - public VisibilityAndGroupingDialog getVisibilityAndGroupingDialog() - { - return visibilityAndGroupingDialog; - } - public BookmarksEditor getBookmarksEditor() { return bookmarkEditor; @@ -191,7 +172,6 @@ protected void loadSettings() try { shared.loadSettings( file.getCanonicalPath(), viewer ); - visibilityAndGroupingDialog.update(); viewer.repaint(); } catch ( final Exception e ) diff --git a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java index 5f8c46c9d..4adcb5dcc 100644 --- a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java +++ b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java @@ -58,11 +58,9 @@ import bdv.spimdata.XmlIoSpimDataMinimal; import bdv.tools.InitializeViewerState; import bdv.tools.bookmarks.Bookmarks; -import bdv.tools.brightness.BrightnessDialog; import bdv.tools.brightness.ConverterSetup; -import bdv.tools.brightness.MinMaxGroup; -import bdv.tools.brightness.SetupAssignments; import bdv.tools.transformation.ManualTransformation; +import bdv.util.Bounds; import bdv.viewer.BasicViewerState; import bdv.viewer.ConverterSetups; import bdv.viewer.DisplayMode; @@ -77,6 +75,7 @@ import ij.io.FileInfo; import ij.process.LUT; import mpicbg.spim.data.SpimDataException; +import mpicbg.spim.data.XmlHelpers; import mpicbg.spim.data.generic.AbstractSpimData; import mpicbg.spim.data.generic.sequence.AbstractSequenceDescription; import mpicbg.spim.data.generic.sequence.BasicImgLoader; @@ -92,19 +91,12 @@ import net.imglib2.realtransform.AffineTransform3D; import net.imglib2.type.numeric.ARGBType; -@SuppressWarnings( "deprecation" ) public class SharedBigDataViewerData { private final ArrayList< SourceAndConverter< ? > > sources; private final ConverterSetups setups; - // TODO: Remove - private final SetupAssignments setupAssignments; - - // TODO: Remove - private BrightnessDialog brightnessDialog; - private final ManualTransformation manualTransformation; private final Bookmarks bookmarks; @@ -127,14 +119,12 @@ private SharedBigDataViewerData( final AbstractSpimData< ? > spimData, final ArrayList< SourceAndConverter< ? > > sources, final ConverterSetups setups, - final SetupAssignments setupAssignments, final CacheControl cache, final int numTimepoints ) { this.spimData = spimData; this.sources = sources; this.setups = setups; - this.setupAssignments = setupAssignments; this.cache = cache; this.numTimepoints = numTimepoints; @@ -210,7 +200,7 @@ public void loadSettings( final String xmlFilename, final ViewerPanel viewer ) t final Element root = doc.getRootElement(); if ( viewer != null ) viewer.stateFromXml( root ); - setupAssignments.restoreFromXml( root ); + restoreFromXmlSetupAssignments( root ); manualTransformation.restoreFromXml( root ); bookmarks.restoreFromXml( root ); } @@ -219,7 +209,7 @@ public void saveSettings( final String xmlFilename, final ViewerPanel viewer ) t { final Element root = new Element( "Settings" ); root.addContent( viewer.stateToXml() ); - root.addContent( setupAssignments.toXml() ); + root.addContent( toXmlSetupAssignments() ); root.addContent( manualTransformation.toXml() ); root.addContent( bookmarks.toXml() ); final Document doc = new Document( root ); @@ -227,6 +217,106 @@ public void saveSettings( final String xmlFilename, final ViewerPanel viewer ) t xout.output( doc, new FileWriter( xmlFilename ) ); } + /** + * Creates an {@link Element} containing suitable information for the + * SetupAssignments part of the serialization of the BDV + * settings. + * + * @return a new {@link Element}. + */ + public Element toXmlSetupAssignments() + { + final Element elem = new Element( "SetupAssignments" ); + + final Element elemConverterSetups = new Element( "ConverterSetups" ); + for ( int i = 0; i < sources.size(); ++i ) + { + final SourceAndConverter< ? > source = sources.get( i ); + final ConverterSetup setup = setups.getConverterSetup( source ); + final Element elemConverterSetup = new Element( "ConverterSetup" ); + elemConverterSetup.addContent( XmlHelpers.intElement( "id", setup.getSetupId() ) ); + elemConverterSetup.addContent( XmlHelpers.doubleElement( "min", setup.getDisplayRangeMin() ) ); + elemConverterSetup.addContent( XmlHelpers.doubleElement( "max", setup.getDisplayRangeMax() ) ); + elemConverterSetup.addContent( XmlHelpers.intElement( "color", setup.getColor().get() ) ); + elemConverterSetup.addContent( XmlHelpers.intElement( "groupId", i ) ); + elemConverterSetups.addContent( elemConverterSetup ); + } + elem.addContent( elemConverterSetups ); + + // Can't save MinMaxGroups without calling to deprecated methods. + // Put a dummy list instead copying single source for now. + final Element elemMinMaxGroups = new Element( "MinMaxGroups" ); + for ( int i = 0; i < sources.size(); ++i ) + { + final SourceAndConverter< ? > source = sources.get( i ); + final ConverterSetup setup = setups.getConverterSetup( source ); + final Bounds bounds = setups.getBounds().getBounds( setup ); + final Element elemMinMaxGroup = new Element( "MinMaxGroup" ); + elemMinMaxGroup.addContent( XmlHelpers.intElement( "id", i ) ); + elemMinMaxGroup.addContent( XmlHelpers.doubleElement( "fullRangeMin", bounds.getMinBound() ) ); + elemMinMaxGroup.addContent( XmlHelpers.doubleElement( "fullRangeMax", bounds.getMaxBound() ) ); + elemMinMaxGroup.addContent( XmlHelpers.doubleElement( "rangeMin", bounds.getMinBound() ) ); + elemMinMaxGroup.addContent( XmlHelpers.doubleElement( "rangeMax", bounds.getMaxBound() ) ); + elemMinMaxGroup.addContent( XmlHelpers.doubleElement( "currentMin", setup.getDisplayRangeMin() ) ); + elemMinMaxGroup.addContent( XmlHelpers.doubleElement( "currentMax", setup.getDisplayRangeMax() ) ); + elemMinMaxGroups.addContent( elemMinMaxGroup ); + } + elem.addContent( elemMinMaxGroups ); + + return elem; + } + + private void restoreFromXmlSetupAssignments( final Element parent ) + { + final Element elemSetupAssignments = parent.getChild( "SetupAssignments" ); + if ( elemSetupAssignments == null ) + return; + final Element elemConverterSetups = elemSetupAssignments.getChild( "ConverterSetups" ); + final List< Element > converterSetupNodes = elemConverterSetups.getChildren( "ConverterSetup" ); + if ( converterSetupNodes.size() != sources.size() ) + throw new IllegalArgumentException(); + + final Element elemMinMaxGroups = elemSetupAssignments.getChild( "MinMaxGroups" ); + final List< Element > minMaxGroupNodes = elemMinMaxGroups.getChildren( "MinMaxGroup" ); + for ( final Element elem : minMaxGroupNodes ) + { + final int id = Integer.parseInt( elem.getChildText( "id" ) ); +// final double fullRangeMin = Double.parseDouble( elem.getChildText( "fullRangeMin" ) ); +// final double fullRangeMax = Double.parseDouble( elem.getChildText( "fullRangeMax" ) ); + final double rangeMin = Double.parseDouble( elem.getChildText( "rangeMin" ) ); + final double rangeMax = Double.parseDouble( elem.getChildText( "rangeMax" ) ); +// final double currentMin = Double.parseDouble( elem.getChildText( "currentMin" ) ); +// final double currentMax = Double.parseDouble( elem.getChildText( "currentMax" ) ); + + final SourceAndConverter< ? > source = sources.get( id ); + final ConverterSetup setup = setups.getConverterSetup( source ); + setups.getBounds().setBounds( setup, new Bounds( rangeMin, rangeMax ) ); + } + + for ( final Element elem : converterSetupNodes ) + { + final int id = Integer.parseInt( elem.getChildText( "id" ) ); + final double min = Double.parseDouble( elem.getChildText( "min" ) ); + final double max = Double.parseDouble( elem.getChildText( "max" ) ); + final int color = Integer.parseInt( elem.getChildText( "color" ) ); +// final int groupId = Integer.parseInt( elem.getChildText( "groupId" ) ); + final ConverterSetup setup = getSetupById( id ); + setup.setDisplayRange( min, max ); + setup.setColor( new ARGBType( color ) ); + } + } + + private ConverterSetup getSetupById( final int id ) + { + for ( final SourceAndConverter< ? > source : sources ) + { + final ConverterSetup setup = setups.getConverterSetup( source ); + if ( setup.getSetupId() == id ) + return setup; + } + return null; + } + public AbstractSpimData< ? > getSpimData() { return spimData; @@ -252,12 +342,6 @@ public ConverterSetups getConverterSetups() return setups; } - @Deprecated - public SetupAssignments getSetupAssignments() - { - return setupAssignments; - } - public int getNumTimepoints() { return numTimepoints; @@ -278,15 +362,6 @@ public ManualTransformation getManualTransformation() return manualTransformation; } - @Deprecated - public synchronized BrightnessDialog getBrightnessDialog() - { - if ( brightnessDialog == null ) - brightnessDialog = new BrightnessDialog( null, setupAssignments ); - - return brightnessDialog; - } - public File getProposedSettingsFile() { return proposedSettingsFile; @@ -369,21 +444,12 @@ private static SharedBigDataViewerData fromSpimData( for ( int i = 0; i < sources.size(); ++i ) setups.put( sources.get( i ), converterSetups.get( i ) ); - final SetupAssignments setupAssignments = new SetupAssignments( converterSetups, 0, 65535 ); - if ( setupAssignments.getMinMaxGroups().size() > 0 ) - { - final MinMaxGroup group = setupAssignments.getMinMaxGroups().get( 0 ); - for ( final ConverterSetup setup : setupAssignments.getConverterSetups() ) - setupAssignments.moveSetupToGroup( setup, group ); - } - WrapBasicImgLoader.removeWrapperIfPresent( spimData ); final SharedBigDataViewerData sbdv = new SharedBigDataViewerData( spimData, sources, setups, - setupAssignments, cache, numTimepoints ); @@ -523,13 +589,10 @@ public static SharedBigDataViewerData fromImagePlus( final ImagePlus imp ) for ( int i = 0; i < sources.size(); i++ ) css.put( sources.get( i ), converterSetups.get( i ) ); - final SetupAssignments setupAssignments = new SetupAssignments( converterSetups, 0, 65535 ); - final SharedBigDataViewerData sbdv = new SharedBigDataViewerData( spimData, sources, css, - setupAssignments, cache, numTimepoints ); @@ -557,12 +620,6 @@ public static SharedBigDataViewerData fromImagePlus( final ImagePlus imp ) transferChannelSettings( channelOffset, imp, state, css ); channelOffset += imp.getNChannels(); state.setDisplayMode( numActiveChannels > 1 ? DisplayMode.FUSED : DisplayMode.SINGLE ); - if ( setupAssignments.getMinMaxGroups().size() > 0 ) - { - final MinMaxGroup group = setupAssignments.getMinMaxGroups().get( 0 ); - for ( final ConverterSetup setup : setupAssignments.getConverterSetups() ) - setupAssignments.moveSetupToGroup( setup, group ); - } } return sbdv; @@ -634,5 +691,4 @@ private static void transferChannelSettings( final int channelOffset, final Imag } } } - } From d2c7caa64dd51f828b2a22ff3224c5533f13587e Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 17 Aug 2023 15:39:42 +0200 Subject: [PATCH 013/220] Do not try to load GUI settings when creating new projects. --- src/main/java/org/mastodon/mamut/io/ProjectLoader.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java index fc49cbcaf..f003e0d21 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java @@ -358,6 +358,10 @@ public static final Model loadModel( final MamutProject project, final Context c */ public static final void loadGUI( final MamutProject project, final WindowManager windowManager ) throws IOException { + final boolean isNewProject = project.getProjectRoot() == null; + if ( isNewProject ) + return; + try (final MamutProject.ProjectReader reader = project.openForReading()) { try From 74541481a10a648c6fbbfb657944b9175b5c9d43 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 17 Aug 2023 15:42:53 +0200 Subject: [PATCH 014/220] Fix minor warnings. --- pom.xml | 2 +- .../mamut/MamutFeatureComputation.java | 1 - .../grapher/display/GrapherSidePanel.java | 4 +- .../java/org/mastodon/util/TreeUtilsTest.java | 60 +++++++++---------- 4 files changed, 33 insertions(+), 34 deletions(-) diff --git a/pom.xml b/pom.xml index 180deb3c7..357016b58 100644 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,7 @@ + org.mastodon @@ -99,7 +100,6 @@ io.humble humble-video-all - 0.3.0 diff --git a/src/main/java/org/mastodon/mamut/MamutFeatureComputation.java b/src/main/java/org/mastodon/mamut/MamutFeatureComputation.java index 466348641..d8fe2ef4e 100644 --- a/src/main/java/org/mastodon/mamut/MamutFeatureComputation.java +++ b/src/main/java/org/mastodon/mamut/MamutFeatureComputation.java @@ -51,7 +51,6 @@ import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; import org.scijava.Context; -import org.scijava.service.AbstractService; public class MamutFeatureComputation { diff --git a/src/main/java/org/mastodon/views/grapher/display/GrapherSidePanel.java b/src/main/java/org/mastodon/views/grapher/display/GrapherSidePanel.java index c22871d83..6076c9fab 100644 --- a/src/main/java/org/mastodon/views/grapher/display/GrapherSidePanel.java +++ b/src/main/java/org/mastodon/views/grapher/display/GrapherSidePanel.java @@ -59,8 +59,8 @@ import org.mastodon.graph.io.RawGraphIO.FileIdToGraphMap; import org.mastodon.mamut.feature.MamutRawFeatureModelIO; import org.mastodon.mamut.io.project.MamutProject; -import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.io.project.MamutProject.ProjectReader; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; @@ -400,7 +400,7 @@ private static final FeatureModel demoFM() final Model model = new Model(); try { - final MamutProject project = new MamutProjectIO().load( "samples/drosophila_crop.mastodon" ); + final MamutProject project = MamutProjectIO.load( "samples/drosophila_crop.mastodon" ); final ProjectReader reader = project.openForReading(); final FileIdToGraphMap< Spot, Link > idmap = model.loadRaw( reader ); diff --git a/src/test/java/org/mastodon/util/TreeUtilsTest.java b/src/test/java/org/mastodon/util/TreeUtilsTest.java index c57ee389a..e43682142 100644 --- a/src/test/java/org/mastodon/util/TreeUtilsTest.java +++ b/src/test/java/org/mastodon/util/TreeUtilsTest.java @@ -30,19 +30,19 @@ public class TreeUtilsTest public void testFindSelectedSubtreeRoots() { // setup - ExampleGraph2 exampleGraph = new ExampleGraph2(); - ModelGraph graph = exampleGraph.getModel().getGraph(); + final ExampleGraph2 exampleGraph = new ExampleGraph2(); + final ModelGraph graph = exampleGraph.getModel().getGraph(); - RefList< Spot > roots = RefCollections.createRefList( graph.vertices() ); + final RefList< Spot > roots = RefCollections.createRefList( graph.vertices() ); roots.add( exampleGraph.spot0 ); - RefSet< Spot > selectedSpots = RefCollections.createRefSet( graph.vertices() ); + final RefSet< Spot > selectedSpots = RefCollections.createRefSet( graph.vertices() ); selectedSpots.add( exampleGraph.spot4 ); selectedSpots.add( exampleGraph.spot7 ); selectedSpots.add( exampleGraph.spot10 ); // process - RefList< Spot > result = TreeUtils.findSelectedSubtreeRoots( graph, roots, selectedSpots ); + final RefList< Spot > result = TreeUtils.findSelectedSubtreeRoots( graph, roots, selectedSpots ); // test assertEquals( 1, result.size() ); @@ -57,20 +57,20 @@ public void testFindSelectedSubtreeRoots() public void testFindSelectedSubTreeRoots_dontGetStuckInLoops() { // setup - ModelGraph graph = new ModelGraph(); - Spot a = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 0 ); - Spot b = graph.addVertex().init( 1, new double[] { 0, 0, 0 }, 0 ); + final ModelGraph graph = new ModelGraph(); + final Spot a = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 0 ); + final Spot b = graph.addVertex().init( 1, new double[] { 0, 0, 0 }, 0 ); graph.addEdge( a, b ); graph.addEdge( b, a ); // loop - RefList< Spot > roots = RefCollections.createRefList( graph.vertices() ); + final RefList< Spot > roots = RefCollections.createRefList( graph.vertices() ); roots.add( a ); - RefSet< Spot > selectedSpots = RefCollections.createRefSet( graph.vertices() ); + final RefSet< Spot > selectedSpots = RefCollections.createRefSet( graph.vertices() ); selectedSpots.add( b ); // process - RefList< Spot > result = TreeUtils.findSelectedSubtreeRoots( graph, roots, selectedSpots ); + final RefList< Spot > result = TreeUtils.findSelectedSubtreeRoots( graph, roots, selectedSpots ); // test assertEquals( Collections.singletonList( b ), result ); @@ -85,12 +85,12 @@ public void testFindRootsOfTheGivenNodes() { // / \ // a2 a3 - ModelGraph graph = new ModelGraph(); - Spot a = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); - Spot a1 = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); - Spot a2 = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); - Spot a3 = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); - Spot b = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); + final ModelGraph graph = new ModelGraph(); + final Spot a = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); + final Spot a1 = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); + final Spot a2 = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); + final Spot a3 = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); + final Spot b = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); graph.addEdge( a, a1 ).init(); graph.addEdge( a1, a2 ).init(); graph.addEdge( a2, a3 ).init(); @@ -104,15 +104,15 @@ public void testFindRootsOfTheGivenNodes() { @Test public void testFindRootsOfTheGivenNodes_dontGetStuckInLoops() { // setup - ModelGraph graph = new ModelGraph(); - Spot a = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); - Spot b = graph.addVertex().init( 1, new double[] { 0, 0, 0 }, 0 ); - Spot c = graph.addVertex().init( 1, new double[] { 0, 0, 0 }, 0 ); + final ModelGraph graph = new ModelGraph(); + final Spot a = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); + final Spot b = graph.addVertex().init( 1, new double[] { 0, 0, 0 }, 0 ); + final Spot c = graph.addVertex().init( 1, new double[] { 0, 0, 0 }, 0 ); graph.addEdge( a, b ); graph.addEdge( b, c ); graph.addEdge( c, b ); // loop between b and c // process - RefSet< Spot > result = TreeUtils.findRootsOfTheGivenNodes( graph, Collections.singleton( c ) ); + final RefSet< Spot > result = TreeUtils.findRootsOfTheGivenNodes( graph, Collections.singleton( c ) ); // test assertEquals( Collections.singleton( a ), result ); } @@ -125,13 +125,13 @@ public void testFindRootsOfTheGivenNodes_noTree() { // c e // | // d - ModelGraph graph = new ModelGraph(); - Spot a = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); - Spot b = graph.addVertex().init( 1, new double[] { 0, 0, 0 }, 1 ); - Spot c = graph.addVertex().init( 2, new double[] { 0, 0, 0 }, 1 ); - Spot d = graph.addVertex().init( 3, new double[] { 0, 0, 0 }, 1 ); - Spot e = graph.addVertex().init( 4, new double[] { 0, 0, 0 }, 1 ); - Spot f = graph.addVertex().init( 4, new double[] { 0, 0, 0 }, 1 ); + final ModelGraph graph = new ModelGraph(); + final Spot a = graph.addVertex().init( 0, new double[] { 0, 0, 0 }, 1 ); + final Spot b = graph.addVertex().init( 1, new double[] { 0, 0, 0 }, 1 ); + final Spot c = graph.addVertex().init( 2, new double[] { 0, 0, 0 }, 1 ); + final Spot d = graph.addVertex().init( 3, new double[] { 0, 0, 0 }, 1 ); + final Spot e = graph.addVertex().init( 4, new double[] { 0, 0, 0 }, 1 ); + graph.addVertex().init( 4, new double[] { 0, 0, 0 }, 1 ); graph.addEdge( a, c ); graph.addEdge( b, c ); graph.addEdge( c, d ); @@ -143,7 +143,7 @@ public void testFindRootsOfTheGivenNodes_noTree() { } @SafeVarargs - private static < T > Set< T > createSet( T... elements ) + private static < T > Set< T > createSet( final T... elements ) { return new HashSet<>( Arrays.asList( elements ) ); } From d095a1cdbb756eade833b5a84b8ce1cc1d318603 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 17 Aug 2023 16:15:44 +0200 Subject: [PATCH 015/220] Add and use convenience methods for opening / creating projects. --- .../org/mastodon/mamut/io/ProjectCreator.java | 58 ++++++++- .../org/mastodon/mamut/io/ProjectLoader.java | 120 +++++++++++++++++- .../mamut/launcher/MastodonDndLauncher.java | 5 +- .../mamut/launcher/MastodonLauncher.java | 26 ++-- .../mastodon/graph/BranchGraphExample.java | 5 +- 5 files changed, 182 insertions(+), 32 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectCreator.java b/src/main/java/org/mastodon/mamut/io/ProjectCreator.java index 5fa145fdb..cd8e77964 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectCreator.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectCreator.java @@ -21,6 +21,7 @@ import org.mastodon.ui.util.XmlFileFilter; import org.scijava.Context; +import ij.ImagePlus; import mpicbg.spim.data.SpimData; import mpicbg.spim.data.SpimDataException; import mpicbg.spim.data.XmlIoSpimData; @@ -62,7 +63,7 @@ public static synchronized ProjectModel createProjectWithDialog( final Context c try { - return createProjectFromBdvFile( file, context, parentComponent ); + return createProjectFromBdvFileWithDialog( file, context, parentComponent ); } catch ( final SpimDataException e ) { @@ -93,7 +94,7 @@ public static synchronized ProjectModel createProjectWithDialog( final Context c * if the BDV file that cannot be opened, and the user declined * to substitute a dummy dataset. */ - public static ProjectModel createProjectFromBdvFile( final File file, final Context context, final Component parentComponent ) throws SpimDataException + public static ProjectModel createProjectFromBdvFileWithDialog( final File file, final Context context, final Component parentComponent ) throws SpimDataException { final MamutProject project = MamutProjectIO.fromBdvFile( file ); try @@ -102,8 +103,33 @@ public static ProjectModel createProjectFromBdvFile( final File file, final Cont } catch ( final IOException e ) { - // Should not happen because the data model and the GUI state are - // empty. + // Should not happen because the data model and the GUI state are empty. + e.printStackTrace(); + } + return null; + } + + /** + * Creates a new project from a BDV/XML file. + * + * @param file + * the BDV file. + * @param context + * the current context. + * @return a new {@link ProjectModel}. + * @throws SpimDataException + * if the BDV file cannot be opened properly. + */ + public static ProjectModel createProjectFromBdvFile( final File file, final Context context ) throws SpimDataException + { + final MamutProject project = MamutProjectIO.fromBdvFile( file ); + try + { + return ProjectLoader.open( project, context ); + } + catch ( final IOException e ) + { + // Should not happen because the data model and the GUI state are empty. e.printStackTrace(); } return null; @@ -199,4 +225,28 @@ public static synchronized ProjectModel createProjectFromUrl( final Context cont } return null; } + + /** + * Creates a new project from an {@link ImagePlus}. + * + * @param imp + * the source image. + * @param context + * the current context. + * @return a new {@link ProjectModel}. + */ + public static ProjectModel createProjectFromImp( final ImagePlus imp, final Context context ) throws SpimDataException + { + final MamutProject project = MamutProjectIO.fromImagePlus( imp ); + try + { + return ProjectLoader.open( project, context ); + } + catch ( final IOException e ) + { + // Should not happen because the data model and the GUI state are empty. + e.printStackTrace(); + } + return null; + } } diff --git a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java index f003e0d21..49b5a8106 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java @@ -56,6 +56,29 @@ public class ProjectLoader private static MamutProject project; + /** + * Opens a project. The GUI state is not restored. + * + * @param mastodonFile + * path to a Mastodon file. + * @param context + * the current context. + * @return the loaded {@link ProjectModel}. + * @throws IOException + * if the project points to a regular image file for image data, + * and that file cannot be opened properly, or if there is a + * problem loading the model data, or if there is a problem + * reading the GUI state. + * @throws SpimDataException + * if the project points to a BDV file for image data, and that + * BDV cannot be opened properly. + */ + public static ProjectModel open( final String mastodonFile, final Context context ) throws IOException, SpimDataException + { + final MamutProject project = MamutProjectIO.load( mastodonFile ); + return open( project, context, false, false ); + } + /** * Opens a project. The GUI state is not restored. * @@ -78,6 +101,35 @@ public static ProjectModel open( final MamutProject project, final Context conte return open( project, context, false, false ); } + /** + * Opens a specified project. + * + * @param mastodonFile + * path to a Mastodon file. + * @param context + * the current context. + * @param restoreGUIState + * if true, the GUI state will be restored. + * @param authorizeSubstituteDummyData + * if true, and if the image data cannot be loaded, + * a dummy image data will be substituted. In that case a + * {@link SpimDataException} is never thrown. + * @return the loaded {@link ProjectModel}. + * @throws IOException + * if the project points to a regular image file for image data, + * and that file cannot be opened properly, or if there is a + * problem loading the model data, or if there is a problem + * reading the GUI state. + * @throws SpimDataException + * if the project points to a BDV file for image data, and that + * BDV cannot be opened properly. + */ + public static ProjectModel open( final String mastodonFile, final Context context, final boolean restoreGUIState, final boolean authorizeSubstituteDummyData ) throws IOException, SpimDataException + { + final MamutProject project = MamutProjectIO.load( mastodonFile ); + return open( project, context, restoreGUIState, authorizeSubstituteDummyData ); + } + /** * Opens a specified project. * @@ -176,7 +228,38 @@ else if ( project != null && project.getProjectRoot() != null ) } /** - * Opens a project interactively. + * Opens a project interactively from a specified Mastodon file. + *

+ * If the image data cannot be loaded a dialog shows up telling the user + * about the problem, and offering to start Mastodon on substituted dummy + * image data. If the user declines, a {@link SpimDataException} is thrown. + *

+ * The GUI state is restored. + * + * @param mastodonFile + * path to a Mastodon file + * @param context + * the current context. + * + * @return the loaded {@link ProjectModel}. + * @throws IOException + * if the project points to a regular image file for image data, + * and that file cannot be opened properly, or if there is a + * problem loading the model data, or if there is a problem + * reading the GUI state. + * @throws SpimDataException + * if the project points to a BDV file that cannot be opened, + * and the user declined to substitute a dummy dataset. + */ + public static synchronized ProjectModel openWithDialog( final String mastodonFile, final Context context ) throws IOException, SpimDataException + { + final MamutProject project = MamutProjectIO.load( mastodonFile ); + return openWithDialog( project, context ); + } + + + /** + * Opens a project interactively from a specified project object. *

* If the image data cannot be loaded a dialog shows up telling the user * about the problem, and offering to start Mastodon on substituted dummy @@ -205,7 +288,40 @@ public static synchronized ProjectModel openWithDialog( final MamutProject proje } /** - * Opens a project interactively. + * Opens a project interactively from a Mastodon file. + *

+ * If the image data cannot be loaded a dialog shows up telling the user + * about the problem, and offering to start Mastodon on substituted dummy + * image data. + *

+ * The GUI state is restored. + * + * @param mastodonFile + * path to a Mastodon file + * @param context + * the current context. + * @param parentComponent + * a component to use as parent to show dialogs during opening. + * Can be null. + * @throws IOException + * if the project points to a regular image file for image data, + * and that file cannot be opened properly and the user declined + * to substitute dummy data; or if there is a problem loading + * the model data; or if there is a problem reading the GUI + * state. + * @throws SpimDataException + * if the project points to a BDV file that cannot be opened, + * and the user declined to substitute a dummy dataset. + * @return the loaded {@link ProjectModel}. + */ + public static synchronized ProjectModel openWithDialog( final String mastodonFile, final Context context, final Component parentComponent ) throws IOException, SpimDataException + { + final MamutProject project = MamutProjectIO.load( mastodonFile ); + return openWithDialog( project, context, parentComponent ); + } + + /** + * Opens a project interactively from a project object. *

* If the image data cannot be loaded a dialog shows up telling the user * about the problem, and offering to start Mastodon on substituted dummy diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java index a74a08f00..414f2b824 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java @@ -34,8 +34,6 @@ import org.mastodon.mamut.MainWindow; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.ProjectLoader; -import org.mastodon.mamut.io.project.MamutProject; -import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.io.AbstractIOPlugin; import org.scijava.io.IOPlugin; import org.scijava.io.location.FileLocation; @@ -78,8 +76,7 @@ public Object open( final Location source ) throws IOException try { - final MamutProject project = MamutProjectIO.load( projectPath ); - final ProjectModel appModel = ProjectLoader.openWithDialog( project, getContext(), null ); + final ProjectModel appModel = ProjectLoader.openWithDialog( projectPath, getContext(), null ); final MainWindow mainWindow = new MainWindow( appModel ); mainWindow.setVisible( true ); } diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java index c590f39d7..dc2f8bddf 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java @@ -62,7 +62,6 @@ import org.mastodon.mamut.io.ProjectCreator; import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.project.MamutProject; -import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; import org.mastodon.ui.util.EverythingDisablerAndReenabler; import org.mastodon.ui.util.ExtensionFileFilter; @@ -141,8 +140,7 @@ private void importSimi() { // Create new blank project from BDV file. final File bdvFile = new File( gui.importSimiBioCellPanel.textAreaBDVFile.getText() ); - final MamutProject project = MamutProjectIO.fromBdvFile( bdvFile ); - final ProjectModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectCreator.createProjectFromBdvFileWithDialog( bdvFile, context, gui ); final Model model = appModel.getModel(); final AbstractSpimData< ? > spimData = appModel.getSharedBdvData().getSpimData(); @@ -245,8 +243,7 @@ private void importTgmm() // Create new blank project from BDV file. final File bdvFile = new File( gui.importTGMMPanel.textAreaBDVFile.getText() ); - final MamutProject project = MamutProjectIO.fromBdvFile( bdvFile ); - final ProjectModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectCreator.createProjectFromBdvFileWithDialog( bdvFile, context, gui ); final Model model = appModel.getModel(); final AbstractSpimData< ? > spimData = appModel.getSharedBdvData().getSpimData(); @@ -351,7 +348,7 @@ private void createNewProject() new Thread( () -> { try { - final ProjectModel appModel = ProjectCreator.createProjectFromBdvFile( file, context, gui ); + final ProjectModel appModel = ProjectCreator.createProjectFromBdvFileWithDialog( file, context, gui ); new MainWindow( appModel ).setVisible( true ); dispose(); } @@ -385,8 +382,7 @@ private void createNewProject() new Thread( () -> { try { - final MamutProject project = MamutProjectIO.fromImagePlus( imp ); - final ProjectModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectCreator.createProjectFromImp( imp, context ); final MainWindow mainWindow = new MainWindow( appModel ); /* @@ -451,7 +447,7 @@ public void windowClosing( final WindowEvent e ) mainWindow.setVisible( true ); dispose(); } - catch ( IOException | SpimDataException e ) + catch ( final SpimDataException e ) { gui.newMastodonProjectPanel.labelInfo.setText( "Invalid image.

" + LauncherUtil.toMessage( e ) + "" ); @@ -494,9 +490,6 @@ private void showHelpPanel() gui.showPanel( LauncherGUI.WELCOME_PANEL_KEY ); } - /* - * TODO: Rework using the ProjectCreator methods. - */ private void createProjectFromURL() { final String filepath = gui.openRemoteURLPanel.taFileSave.getText(); @@ -550,8 +543,7 @@ private void createProjectFromURL() /* * Open it as a new Mastodon project. */ - final MamutProject project = MamutProjectIO.fromBdvFile( file ); - final ProjectModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectCreator.createProjectFromBdvFileWithDialog( file, context, gui ); new MainWindow( appModel ).setVisible( true ); /* @@ -562,7 +554,7 @@ private void createProjectFromURL() dispose(); } - catch ( IOException | SpimDataException e ) + catch ( final SpimDataException e ) { gui.openRemoteURLPanel.log.setForeground( Color.RED ); gui.openRemoteURLPanel.log.setText( "Problem creating project.

" + @@ -655,9 +647,7 @@ private void loadMastodonProject( final String projectPath ) try { - final MamutProject project = MamutProjectIO.load( file.getAbsolutePath() ); - final ProjectModel appModel = ProjectLoader.open( project, context ); - + final ProjectModel appModel = ProjectLoader.open( file.getAbsolutePath(), context ); new MainWindow( appModel ).setVisible( true ); dispose(); /* diff --git a/src/test/java/org/mastodon/graph/BranchGraphExample.java b/src/test/java/org/mastodon/graph/BranchGraphExample.java index 554455a2b..cd7c71daf 100644 --- a/src/test/java/org/mastodon/graph/BranchGraphExample.java +++ b/src/test/java/org/mastodon/graph/BranchGraphExample.java @@ -37,8 +37,6 @@ import org.mastodon.mamut.MainWindow; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.ProjectLoader; -import org.mastodon.mamut.io.project.MamutProject; -import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.Context; public class BranchGraphExample @@ -52,8 +50,7 @@ public static void main( final String[] args ) throws IOException final String projectPath = "samples/test_branchgraph.mastodon"; // final String projectPath = "samples/mette_e1.mastodon"; // final String projectPath = "samples/mette_e1_small.mastodon"; - final MamutProject project = MamutProjectIO.load( projectPath ); - final ProjectModel appModel = ProjectLoader.open( project, context ); + final ProjectModel appModel = ProjectLoader.open( projectPath, context ); new MainWindow( appModel ).setVisible( true ); } catch ( final Exception e1 ) From 758dd82e1ef6618e1b1c4b4b38af0322fb021932 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 17 Aug 2023 16:24:04 +0200 Subject: [PATCH 016/220] Move the importer package into the io package. --- .../mastodon/mamut/io/ProjectExporter.java | 2 +- .../mastodon/mamut/io/ProjectImporter.java | 6 +- .../{ => io}/importer/ModelImporter.java | 2 +- .../mamut/{ => io}/importer/package-info.java | 2 +- .../importer/simi/SimiImportDialog.java | 2 +- .../{ => io}/importer/simi/SimiImporter.java | 16 +-- .../{ => io}/importer/simi/package-info.java | 2 +- .../importer/tgmm/TgmmImportDialog.java | 2 +- .../{ => io}/importer/tgmm/TgmmImporter.java | 4 +- .../{ => io}/importer/tgmm/package-info.java | 2 +- .../importer/trackmate/MamutExporter.java | 134 +++++++++--------- .../trackmate/TrackMateImportedFeatures.java | 2 +- .../TrackMateImportedFeaturesSerializer.java | 2 +- .../TrackMateImportedLinkFeatures.java | 2 +- ...ackMateImportedLinkFeaturesSerializer.java | 2 +- .../TrackMateImportedSpotFeatures.java | 2 +- ...ackMateImportedSpotFeaturesSerializer.java | 2 +- .../importer/trackmate/TrackMateImporter.java | 80 +++++------ .../importer/trackmate/TrackMateXMLKeys.java | 2 +- .../importer/trackmate/package-info.java | 2 +- .../mamut/launcher/MastodonLauncher.java | 8 +- .../revised/CreateLargeModelExample.java | 2 +- .../{ => io}/importer/MaMuTExportExample.java | 6 +- .../importer/MaMuTImporterExample.java | 4 +- .../importer/TrackMateImporterTest.java | 12 +- .../importer/trackmate/MaMuTExporterTest.java | 3 +- .../mamut/{ => io}/importer/FakeTracks.tif | 0 .../mamut/{ => io}/importer/FakeTracks.xml | 0 .../trackmate/mamutproject/FakeTracks.xml | 0 .../trackmate/mamutproject/FakeTracksBDV.h5 | Bin .../trackmate/mamutproject/FakeTracksBDV.xml | 0 .../features/Link displacement.raw | Bin .../mamutproject/features/Link velocity.raw | Bin .../features/Spot center intensity.raw | Bin .../mamutproject/features/Spot intensity.raw | Bin .../mamutproject/features/Spot quick mean.raw | Bin .../mamutproject/features/Spot radius.raw | Bin .../mamutproject/features/Spot track ID.raw | Bin .../mamutproject/features/Track N spots.raw | Bin .../importer/trackmate/mamutproject/gui.xml | 0 .../importer/trackmate/mamutproject/model.raw | Bin .../trackmate/mamutproject/project.xml | 0 .../importer/trackmate/mamutproject/tags.raw | Bin 43 files changed, 153 insertions(+), 152 deletions(-) rename src/main/java/org/mastodon/mamut/{ => io}/importer/ModelImporter.java (98%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/package-info.java (97%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/simi/SimiImportDialog.java (99%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/simi/SimiImporter.java (96%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/simi/package-info.java (97%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/tgmm/TgmmImportDialog.java (99%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/tgmm/TgmmImporter.java (99%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/tgmm/package-info.java (97%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/trackmate/MamutExporter.java (82%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/trackmate/TrackMateImportedFeatures.java (98%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/trackmate/TrackMateImportedFeaturesSerializer.java (98%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/trackmate/TrackMateImportedLinkFeatures.java (98%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/trackmate/TrackMateImportedLinkFeaturesSerializer.java (97%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/trackmate/TrackMateImportedSpotFeatures.java (98%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/trackmate/TrackMateImportedSpotFeaturesSerializer.java (97%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/trackmate/TrackMateImporter.java (83%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/trackmate/TrackMateXMLKeys.java (99%) rename src/main/java/org/mastodon/mamut/{ => io}/importer/trackmate/package-info.java (97%) rename src/test/java/org/mastodon/mamut/{ => io}/importer/MaMuTExportExample.java (97%) rename src/test/java/org/mastodon/mamut/{ => io}/importer/MaMuTImporterExample.java (97%) rename src/test/java/org/mastodon/mamut/{ => io}/importer/TrackMateImporterTest.java (96%) rename src/test/java/org/mastodon/mamut/{ => io}/importer/trackmate/MaMuTExporterTest.java (99%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/FakeTracks.tif (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/FakeTracks.xml (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/FakeTracks.xml (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/FakeTracksBDV.h5 (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/FakeTracksBDV.xml (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/features/Link displacement.raw (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/features/Link velocity.raw (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/features/Spot center intensity.raw (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/features/Spot intensity.raw (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/features/Spot quick mean.raw (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/features/Spot radius.raw (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/features/Spot track ID.raw (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/features/Track N spots.raw (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/gui.xml (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/model.raw (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/project.xml (100%) rename src/test/resources/org/mastodon/mamut/{ => io}/importer/trackmate/mamutproject/tags.raw (100%) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectExporter.java b/src/main/java/org/mastodon/mamut/io/ProjectExporter.java index eab99e9f2..0fb018ce7 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectExporter.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectExporter.java @@ -11,7 +11,7 @@ import javax.swing.JOptionPane; import org.mastodon.mamut.ProjectModel; -import org.mastodon.mamut.importer.trackmate.MamutExporter; +import org.mastodon.mamut.io.importer.trackmate.MamutExporter; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.ui.util.FileChooser; import org.mastodon.ui.util.XmlFileFilter; diff --git a/src/main/java/org/mastodon/mamut/io/ProjectImporter.java b/src/main/java/org/mastodon/mamut/io/ProjectImporter.java index 03aac64fc..8030b8347 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectImporter.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectImporter.java @@ -11,9 +11,9 @@ import org.mastodon.feature.FeatureSpecsService; import org.mastodon.mamut.ProjectModel; -import org.mastodon.mamut.importer.simi.SimiImportDialog; -import org.mastodon.mamut.importer.tgmm.TgmmImportDialog; -import org.mastodon.mamut.importer.trackmate.TrackMateImporter; +import org.mastodon.mamut.io.importer.simi.SimiImportDialog; +import org.mastodon.mamut.io.importer.tgmm.TgmmImportDialog; +import org.mastodon.mamut.io.importer.trackmate.TrackMateImporter; import org.mastodon.ui.util.FileChooser; import org.mastodon.ui.util.XmlFileFilter; import org.scijava.Context; diff --git a/src/main/java/org/mastodon/mamut/importer/ModelImporter.java b/src/main/java/org/mastodon/mamut/io/importer/ModelImporter.java similarity index 98% rename from src/main/java/org/mastodon/mamut/importer/ModelImporter.java rename to src/main/java/org/mastodon/mamut/io/importer/ModelImporter.java index 006603643..9121a207b 100644 --- a/src/main/java/org/mastodon/mamut/importer/ModelImporter.java +++ b/src/main/java/org/mastodon/mamut/io/importer/ModelImporter.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer; +package org.mastodon.mamut.io.importer; import org.mastodon.mamut.model.Model; import org.mastodon.model.AbstractModelImporter; diff --git a/src/main/java/org/mastodon/mamut/importer/package-info.java b/src/main/java/org/mastodon/mamut/io/importer/package-info.java similarity index 97% rename from src/main/java/org/mastodon/mamut/importer/package-info.java rename to src/main/java/org/mastodon/mamut/io/importer/package-info.java index ea1c9431c..62ab6b1e0 100644 --- a/src/main/java/org/mastodon/mamut/importer/package-info.java +++ b/src/main/java/org/mastodon/mamut/io/importer/package-info.java @@ -29,4 +29,4 @@ /** * Importer for various file formats in Mastodon. */ -package org.mastodon.mamut.importer; +package org.mastodon.mamut.io.importer; diff --git a/src/main/java/org/mastodon/mamut/importer/simi/SimiImportDialog.java b/src/main/java/org/mastodon/mamut/io/importer/simi/SimiImportDialog.java similarity index 99% rename from src/main/java/org/mastodon/mamut/importer/simi/SimiImportDialog.java rename to src/main/java/org/mastodon/mamut/io/importer/simi/SimiImportDialog.java index ff9234073..39e85e8b1 100644 --- a/src/main/java/org/mastodon/mamut/importer/simi/SimiImportDialog.java +++ b/src/main/java/org/mastodon/mamut/io/importer/simi/SimiImportDialog.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.simi; +package org.mastodon.mamut.io.importer.simi; import java.awt.BorderLayout; import java.awt.Frame; diff --git a/src/main/java/org/mastodon/mamut/importer/simi/SimiImporter.java b/src/main/java/org/mastodon/mamut/io/importer/simi/SimiImporter.java similarity index 96% rename from src/main/java/org/mastodon/mamut/importer/simi/SimiImporter.java rename to src/main/java/org/mastodon/mamut/io/importer/simi/SimiImporter.java index a31c6e956..c5e44ed51 100644 --- a/src/main/java/org/mastodon/mamut/importer/simi/SimiImporter.java +++ b/src/main/java/org/mastodon/mamut/io/importer/simi/SimiImporter.java @@ -26,14 +26,14 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.simi; +package org.mastodon.mamut.io.importer.simi; -import static org.mastodon.mamut.importer.simi.SimiImporter.ExpectedNumTokens.atleast; -import static org.mastodon.mamut.importer.simi.SimiImporter.ExpectedNumTokens.exactly; -import static org.mastodon.mamut.importer.simi.SimiImporter.LineType.EOF; -import static org.mastodon.mamut.importer.simi.SimiImporter.LineType.HEADER; -import static org.mastodon.mamut.importer.simi.SimiImporter.LineType.NORMAL; -import static org.mastodon.mamut.importer.simi.SimiImporter.LineType.SEPARATOR; +import static org.mastodon.mamut.io.importer.simi.SimiImporter.ExpectedNumTokens.atleast; +import static org.mastodon.mamut.io.importer.simi.SimiImporter.ExpectedNumTokens.exactly; +import static org.mastodon.mamut.io.importer.simi.SimiImporter.LineType.EOF; +import static org.mastodon.mamut.io.importer.simi.SimiImporter.LineType.HEADER; +import static org.mastodon.mamut.io.importer.simi.SimiImporter.LineType.NORMAL; +import static org.mastodon.mamut.io.importer.simi.SimiImporter.LineType.SEPARATOR; import java.io.Closeable; import java.io.File; @@ -49,7 +49,7 @@ import java.util.function.IntUnaryOperator; import java.util.stream.Stream; -import org.mastodon.mamut.importer.ModelImporter; +import org.mastodon.mamut.io.importer.ModelImporter; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelGraph; diff --git a/src/main/java/org/mastodon/mamut/importer/simi/package-info.java b/src/main/java/org/mastodon/mamut/io/importer/simi/package-info.java similarity index 97% rename from src/main/java/org/mastodon/mamut/importer/simi/package-info.java rename to src/main/java/org/mastodon/mamut/io/importer/simi/package-info.java index 666ff24fc..636544891 100644 --- a/src/main/java/org/mastodon/mamut/importer/simi/package-info.java +++ b/src/main/java/org/mastodon/mamut/io/importer/simi/package-info.java @@ -31,4 +31,4 @@ *

* @see http://www.simi.com/en/products/cell-research/simi-biocell.html */ -package org.mastodon.mamut.importer.simi; +package org.mastodon.mamut.io.importer.simi; diff --git a/src/main/java/org/mastodon/mamut/importer/tgmm/TgmmImportDialog.java b/src/main/java/org/mastodon/mamut/io/importer/tgmm/TgmmImportDialog.java similarity index 99% rename from src/main/java/org/mastodon/mamut/importer/tgmm/TgmmImportDialog.java rename to src/main/java/org/mastodon/mamut/io/importer/tgmm/TgmmImportDialog.java index 6afc9c02e..dfbfa08d2 100644 --- a/src/main/java/org/mastodon/mamut/importer/tgmm/TgmmImportDialog.java +++ b/src/main/java/org/mastodon/mamut/io/importer/tgmm/TgmmImportDialog.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.tgmm; +package org.mastodon.mamut.io.importer.tgmm; import java.awt.BorderLayout; import java.awt.Frame; diff --git a/src/main/java/org/mastodon/mamut/importer/tgmm/TgmmImporter.java b/src/main/java/org/mastodon/mamut/io/importer/tgmm/TgmmImporter.java similarity index 99% rename from src/main/java/org/mastodon/mamut/importer/tgmm/TgmmImporter.java rename to src/main/java/org/mastodon/mamut/io/importer/tgmm/TgmmImporter.java index 435d1d56c..fed073cc4 100644 --- a/src/main/java/org/mastodon/mamut/importer/tgmm/TgmmImporter.java +++ b/src/main/java/org/mastodon/mamut/io/importer/tgmm/TgmmImporter.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.tgmm; +package org.mastodon.mamut.io.importer.tgmm; import static mpicbg.spim.data.XmlHelpers.getDoubleArrayAttribute; import static mpicbg.spim.data.XmlHelpers.getDoubleAttribute; @@ -46,7 +46,7 @@ import org.mastodon.collection.IntRefMap; import org.mastodon.collection.RefMaps; import org.mastodon.graph.Graph; -import org.mastodon.mamut.importer.ModelImporter; +import org.mastodon.mamut.io.importer.ModelImporter; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; diff --git a/src/main/java/org/mastodon/mamut/importer/tgmm/package-info.java b/src/main/java/org/mastodon/mamut/io/importer/tgmm/package-info.java similarity index 97% rename from src/main/java/org/mastodon/mamut/importer/tgmm/package-info.java rename to src/main/java/org/mastodon/mamut/io/importer/tgmm/package-info.java index 5d375fa0b..0de94c77a 100644 --- a/src/main/java/org/mastodon/mamut/importer/tgmm/package-info.java +++ b/src/main/java/org/mastodon/mamut/io/importer/tgmm/package-info.java @@ -31,4 +31,4 @@ *

* @see https://github.com/KellerLabTeam/tgmm-docker */ -package org.mastodon.mamut.importer.tgmm; +package org.mastodon.mamut.io.importer.tgmm; diff --git a/src/main/java/org/mastodon/mamut/importer/trackmate/MamutExporter.java b/src/main/java/org/mastodon/mamut/io/importer/trackmate/MamutExporter.java similarity index 82% rename from src/main/java/org/mastodon/mamut/importer/trackmate/MamutExporter.java rename to src/main/java/org/mastodon/mamut/io/importer/trackmate/MamutExporter.java index 3d548a74f..666a2d465 100644 --- a/src/main/java/org/mastodon/mamut/importer/trackmate/MamutExporter.java +++ b/src/main/java/org/mastodon/mamut/io/importer/trackmate/MamutExporter.java @@ -26,75 +26,75 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.trackmate; +package org.mastodon.mamut.io.importer.trackmate; import static org.mastodon.feature.Multiplicity.SINGLE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.ANALYZER_COLLECTION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.ANALYZER_KEY_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.ANALYZER_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.BOOKMARKS_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.EDGE_ANALYZERS_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.EDGE_FEATURE_DECLARATION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.EDGE_SOURCE_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.EDGE_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.EDGE_TARGET_ANALYZER_VALUE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.EDGE_TARGET_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FEATURE_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FEATURE_DECLARATION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FEATURE_DIMENSION_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FEATURE_ISINT_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FEATURE_NAME_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FEATURE_SHORT_NAME_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FEATURE_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FILENAME_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FILTERED_TRACKS_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FILTER_FEATURE_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FILTER_IS_ABOVE_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FILTER_VALUE_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FOLDER_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FRAME_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FRAME_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.GUI_STATE_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.HEIGHT_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.ID_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.IMAGE_DATA_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.INITIAL_SPOT_FILTER_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.LABEL_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.MODEL_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.NFRAMES_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.NSLICES_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.PIXEL_HEIGHT_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.PIXEL_WIDTH_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.POSITION_T_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.POSITION_X_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.POSITION_Y_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.POSITION_Z_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.QUALITY_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.RADIUS_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SETTINGS_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SETUP_ASSIGNMENTS_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SPATIAL_UNITS_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SPOT_ANALYZERS_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SPOT_COLLECTION_NSPOTS_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SPOT_COLLECTION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SPOT_ELEMENT_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SPOT_FEATURE_DECLARATION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SPOT_FILTER_COLLECTION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SPOT_FRAME_COLLECTION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.TIME_UNITS_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.TRACKMATE_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.TRACK_ANALYZERS_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.TRACK_COLLECTION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.TRACK_FEATURE_DECLARATION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.TRACK_FILTER_COLLECTION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.TRACK_ID_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.TRACK_ID_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.TRACK_NAME_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.TRACK_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.VERSION_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.VISIBILITY_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.VOXEL_DEPTH_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.WIDTH_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.ANALYZER_COLLECTION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.ANALYZER_KEY_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.ANALYZER_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.BOOKMARKS_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.EDGE_ANALYZERS_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.EDGE_FEATURE_DECLARATION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.EDGE_SOURCE_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.EDGE_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.EDGE_TARGET_ANALYZER_VALUE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.EDGE_TARGET_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FEATURE_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FEATURE_DECLARATION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FEATURE_DIMENSION_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FEATURE_ISINT_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FEATURE_NAME_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FEATURE_SHORT_NAME_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FEATURE_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FILENAME_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FILTERED_TRACKS_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FILTER_FEATURE_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FILTER_IS_ABOVE_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FILTER_VALUE_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FOLDER_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FRAME_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FRAME_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.GUI_STATE_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.HEIGHT_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.ID_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.IMAGE_DATA_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.INITIAL_SPOT_FILTER_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.LABEL_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.MODEL_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.NFRAMES_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.NSLICES_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.PIXEL_HEIGHT_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.PIXEL_WIDTH_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.POSITION_T_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.POSITION_X_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.POSITION_Y_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.POSITION_Z_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.QUALITY_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.RADIUS_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SETTINGS_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SETUP_ASSIGNMENTS_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SPATIAL_UNITS_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SPOT_ANALYZERS_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SPOT_COLLECTION_NSPOTS_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SPOT_COLLECTION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SPOT_ELEMENT_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SPOT_FEATURE_DECLARATION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SPOT_FILTER_COLLECTION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SPOT_FRAME_COLLECTION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.TIME_UNITS_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.TRACKMATE_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.TRACK_ANALYZERS_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.TRACK_COLLECTION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.TRACK_FEATURE_DECLARATION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.TRACK_FILTER_COLLECTION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.TRACK_ID_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.TRACK_ID_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.TRACK_NAME_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.TRACK_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.VERSION_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.VISIBILITY_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.VOXEL_DEPTH_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.WIDTH_ATTRIBUTE; import java.io.File; import java.io.FileOutputStream; diff --git a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedFeatures.java b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedFeatures.java similarity index 98% rename from src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedFeatures.java rename to src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedFeatures.java index 428dfbfa1..5a589fc34 100644 --- a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedFeatures.java +++ b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedFeatures.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.trackmate; +package org.mastodon.mamut.io.importer.trackmate; import java.util.HashMap; import java.util.LinkedHashSet; diff --git a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedFeaturesSerializer.java b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedFeaturesSerializer.java similarity index 98% rename from src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedFeaturesSerializer.java rename to src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedFeaturesSerializer.java index 0ae121941..7928827c4 100644 --- a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedFeaturesSerializer.java +++ b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedFeaturesSerializer.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.trackmate; +package org.mastodon.mamut.io.importer.trackmate; import java.io.IOException; import java.io.ObjectInputStream; diff --git a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedLinkFeatures.java b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedLinkFeatures.java similarity index 98% rename from src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedLinkFeatures.java rename to src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedLinkFeatures.java index cbb4f671f..0846c0577 100644 --- a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedLinkFeatures.java +++ b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedLinkFeatures.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.trackmate; +package org.mastodon.mamut.io.importer.trackmate; import org.mastodon.feature.Dimension; import org.mastodon.feature.Feature; diff --git a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedLinkFeaturesSerializer.java b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedLinkFeaturesSerializer.java similarity index 97% rename from src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedLinkFeaturesSerializer.java rename to src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedLinkFeaturesSerializer.java index 746006df9..6af960d55 100644 --- a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedLinkFeaturesSerializer.java +++ b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedLinkFeaturesSerializer.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.trackmate; +package org.mastodon.mamut.io.importer.trackmate; import java.io.IOException; import java.io.ObjectInputStream; diff --git a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedSpotFeatures.java b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedSpotFeatures.java similarity index 98% rename from src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedSpotFeatures.java rename to src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedSpotFeatures.java index 07e3d7dbf..d47362d90 100644 --- a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedSpotFeatures.java +++ b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedSpotFeatures.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.trackmate; +package org.mastodon.mamut.io.importer.trackmate; import org.mastodon.feature.Dimension; import org.mastodon.feature.Feature; diff --git a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedSpotFeaturesSerializer.java b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedSpotFeaturesSerializer.java similarity index 97% rename from src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedSpotFeaturesSerializer.java rename to src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedSpotFeaturesSerializer.java index c8de9cfab..50fa8754e 100644 --- a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImportedSpotFeaturesSerializer.java +++ b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImportedSpotFeaturesSerializer.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.trackmate; +package org.mastodon.mamut.io.importer.trackmate; import java.io.IOException; import java.io.ObjectInputStream; diff --git a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImporter.java b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImporter.java similarity index 83% rename from src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImporter.java rename to src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImporter.java index c24c9a5e5..02fe76789 100644 --- a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateImporter.java +++ b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateImporter.java @@ -26,45 +26,45 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.trackmate; - -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.EDGE_FEATURE_DECLARATION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.EDGE_SOURCE_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.EDGE_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.EDGE_TARGET_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FEATURE_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FEATURE_DECLARATION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FEATURE_DIMENSION_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FEATURE_ISINT_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FEATURE_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FILENAME_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FOLDER_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.FRAME_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.HEIGHT_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.ID_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.IMAGE_DATA_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.LABEL_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.MODEL_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.NFRAMES_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.NSLICES_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.PIXEL_HEIGHT_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.PIXEL_WIDTH_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.POSITION_X_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.POSITION_Y_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.POSITION_Z_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.RADIUS_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SETTINGS_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SPATIAL_UNITS_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SPOT_COLLECTION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SPOT_ELEMENT_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SPOT_FEATURE_DECLARATION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.SPOT_FRAME_COLLECTION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.TIME_UNITS_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.TRACK_COLLECTION_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.TRACK_TAG; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.VISIBILITY_FEATURE_NAME; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.VOXEL_DEPTH_ATTRIBUTE; -import static org.mastodon.mamut.importer.trackmate.TrackMateXMLKeys.WIDTH_ATTRIBUTE; +package org.mastodon.mamut.io.importer.trackmate; + +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.EDGE_FEATURE_DECLARATION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.EDGE_SOURCE_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.EDGE_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.EDGE_TARGET_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FEATURE_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FEATURE_DECLARATION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FEATURE_DIMENSION_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FEATURE_ISINT_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FEATURE_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FILENAME_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FOLDER_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.FRAME_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.HEIGHT_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.ID_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.IMAGE_DATA_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.LABEL_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.MODEL_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.NFRAMES_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.NSLICES_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.PIXEL_HEIGHT_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.PIXEL_WIDTH_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.POSITION_X_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.POSITION_Y_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.POSITION_Z_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.RADIUS_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SETTINGS_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SPATIAL_UNITS_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SPOT_COLLECTION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SPOT_ELEMENT_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SPOT_FEATURE_DECLARATION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.SPOT_FRAME_COLLECTION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.TIME_UNITS_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.TRACK_COLLECTION_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.TRACK_TAG; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.VISIBILITY_FEATURE_NAME; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.VOXEL_DEPTH_ATTRIBUTE; +import static org.mastodon.mamut.io.importer.trackmate.TrackMateXMLKeys.WIDTH_ATTRIBUTE; import java.io.File; import java.io.IOException; @@ -84,7 +84,7 @@ import org.mastodon.feature.Dimension; import org.mastodon.feature.FeatureModel; import org.mastodon.feature.FeatureSpecsService; -import org.mastodon.mamut.importer.ModelImporter; +import org.mastodon.mamut.io.importer.ModelImporter; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; diff --git a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateXMLKeys.java b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateXMLKeys.java similarity index 99% rename from src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateXMLKeys.java rename to src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateXMLKeys.java index e9ff3692f..0941d2831 100644 --- a/src/main/java/org/mastodon/mamut/importer/trackmate/TrackMateXMLKeys.java +++ b/src/main/java/org/mastodon/mamut/io/importer/trackmate/TrackMateXMLKeys.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.trackmate; +package org.mastodon.mamut.io.importer.trackmate; public class TrackMateXMLKeys { diff --git a/src/main/java/org/mastodon/mamut/importer/trackmate/package-info.java b/src/main/java/org/mastodon/mamut/io/importer/trackmate/package-info.java similarity index 97% rename from src/main/java/org/mastodon/mamut/importer/trackmate/package-info.java rename to src/main/java/org/mastodon/mamut/io/importer/trackmate/package-info.java index be7dbee97..e475c99e3 100644 --- a/src/main/java/org/mastodon/mamut/importer/trackmate/package-info.java +++ b/src/main/java/org/mastodon/mamut/io/importer/trackmate/package-info.java @@ -32,4 +32,4 @@ * @see https://imagej.net/TrackMate * @see https://imagej.net/MaMuT */ -package org.mastodon.mamut.importer.trackmate; +package org.mastodon.mamut.io.importer.trackmate; diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java index dc2f8bddf..6b166c58e 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java @@ -55,12 +55,12 @@ import org.mastodon.feature.FeatureSpecsService; import org.mastodon.mamut.MainWindow; import org.mastodon.mamut.ProjectModel; -import org.mastodon.mamut.importer.simi.SimiImporter; -import org.mastodon.mamut.importer.simi.SimiImporter.LabelFunction; -import org.mastodon.mamut.importer.tgmm.TgmmImporter; -import org.mastodon.mamut.importer.trackmate.TrackMateImporter; import org.mastodon.mamut.io.ProjectCreator; import org.mastodon.mamut.io.ProjectLoader; +import org.mastodon.mamut.io.importer.simi.SimiImporter; +import org.mastodon.mamut.io.importer.simi.SimiImporter.LabelFunction; +import org.mastodon.mamut.io.importer.tgmm.TgmmImporter; +import org.mastodon.mamut.io.importer.trackmate.TrackMateImporter; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.model.Model; import org.mastodon.ui.util.EverythingDisablerAndReenabler; diff --git a/src/test/java/org/mastodon/graph/revised/CreateLargeModelExample.java b/src/test/java/org/mastodon/graph/revised/CreateLargeModelExample.java index 76ee31f47..6887c937c 100644 --- a/src/test/java/org/mastodon/graph/revised/CreateLargeModelExample.java +++ b/src/test/java/org/mastodon/graph/revised/CreateLargeModelExample.java @@ -28,7 +28,7 @@ */ package org.mastodon.graph.revised; -import org.mastodon.mamut.importer.ModelImporter; +import org.mastodon.mamut.io.importer.ModelImporter; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; diff --git a/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java b/src/test/java/org/mastodon/mamut/io/importer/MaMuTExportExample.java similarity index 97% rename from src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java rename to src/test/java/org/mastodon/mamut/io/importer/MaMuTExportExample.java index 56c9fda1d..0dc0897d9 100644 --- a/src/test/java/org/mastodon/mamut/importer/MaMuTExportExample.java +++ b/src/test/java/org/mastodon/mamut/io/importer/MaMuTExportExample.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer; +package org.mastodon.mamut.io.importer; import java.io.File; import java.io.IOException; @@ -42,9 +42,9 @@ import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.feature.MamutFeatureComputerService; import org.mastodon.mamut.feature.TrackSizeFeature; -import org.mastodon.mamut.importer.trackmate.MamutExporter; -import org.mastodon.mamut.importer.trackmate.TrackMateImporter; import org.mastodon.mamut.io.ProjectLoader; +import org.mastodon.mamut.io.importer.trackmate.MamutExporter; +import org.mastodon.mamut.io.importer.trackmate.TrackMateImporter; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; diff --git a/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java b/src/test/java/org/mastodon/mamut/io/importer/MaMuTImporterExample.java similarity index 97% rename from src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java rename to src/test/java/org/mastodon/mamut/io/importer/MaMuTImporterExample.java index cbbf814ce..59fc1cff4 100644 --- a/src/test/java/org/mastodon/mamut/importer/MaMuTImporterExample.java +++ b/src/test/java/org/mastodon/mamut/io/importer/MaMuTImporterExample.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer; +package org.mastodon.mamut.io.importer; import java.io.File; import java.io.IOException; @@ -37,9 +37,9 @@ import org.mastodon.feature.FeatureSpecsService; import org.mastodon.mamut.ProjectModel; -import org.mastodon.mamut.importer.trackmate.TrackMateImporter; import org.mastodon.mamut.io.ProjectLoader; import org.mastodon.mamut.io.ProjectSaver; +import org.mastodon.mamut.io.importer.trackmate.TrackMateImporter; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelUtils; diff --git a/src/test/java/org/mastodon/mamut/importer/TrackMateImporterTest.java b/src/test/java/org/mastodon/mamut/io/importer/TrackMateImporterTest.java similarity index 96% rename from src/test/java/org/mastodon/mamut/importer/TrackMateImporterTest.java rename to src/test/java/org/mastodon/mamut/io/importer/TrackMateImporterTest.java index 9e4331806..0cdde1945 100644 --- a/src/test/java/org/mastodon/mamut/importer/TrackMateImporterTest.java +++ b/src/test/java/org/mastodon/mamut/io/importer/TrackMateImporterTest.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer; +package org.mastodon.mamut.io.importer; import static org.hamcrest.CoreMatchers.instanceOf; import static org.junit.Assert.assertEquals; @@ -54,11 +54,11 @@ import org.mastodon.feature.FeatureSpecsService; import org.mastodon.feature.IntFeatureProjection; import org.mastodon.graph.algorithm.RootFinder; -import org.mastodon.mamut.importer.trackmate.TrackMateImportedLinkFeatures; -import org.mastodon.mamut.importer.trackmate.TrackMateImportedSpotFeatures; -import org.mastodon.mamut.importer.trackmate.TrackMateImportedSpotFeatures.Spec; +import org.mastodon.mamut.io.importer.trackmate.TrackMateImportedLinkFeatures; +import org.mastodon.mamut.io.importer.trackmate.TrackMateImportedSpotFeatures; +import org.mastodon.mamut.io.importer.trackmate.TrackMateImporter; +import org.mastodon.mamut.io.importer.trackmate.TrackMateImportedSpotFeatures.Spec; import org.mastodon.mamut.io.project.MamutProject; -import org.mastodon.mamut.importer.trackmate.TrackMateImporter; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelGraph; @@ -242,7 +242,7 @@ public void test() throws Exception final Spec specSpots = new TrackMateImportedSpotFeatures.Spec(); assertTrue( "The feature model should contain the specs for TrackMateImportedSpotFeatures.", specs.contains( specSpots ) ); - final org.mastodon.mamut.importer.trackmate.TrackMateImportedLinkFeatures.Spec specLinks = + final org.mastodon.mamut.io.importer.trackmate.TrackMateImportedLinkFeatures.Spec specLinks = new TrackMateImportedLinkFeatures.Spec(); assertTrue( "The feature model should contain the specs for TrackMateImportedLinkFeatures.", specs.contains( specLinks ) ); diff --git a/src/test/java/org/mastodon/mamut/importer/trackmate/MaMuTExporterTest.java b/src/test/java/org/mastodon/mamut/io/importer/trackmate/MaMuTExporterTest.java similarity index 99% rename from src/test/java/org/mastodon/mamut/importer/trackmate/MaMuTExporterTest.java rename to src/test/java/org/mastodon/mamut/io/importer/trackmate/MaMuTExporterTest.java index a5ccb5b18..945a8702b 100644 --- a/src/test/java/org/mastodon/mamut/importer/trackmate/MaMuTExporterTest.java +++ b/src/test/java/org/mastodon/mamut/io/importer/trackmate/MaMuTExporterTest.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut.importer.trackmate; +package org.mastodon.mamut.io.importer.trackmate; import static fiji.plugin.trackmate.io.TmXmlKeys.IMAGE_ELEMENT_KEY; import static fiji.plugin.trackmate.io.TmXmlKeys.IMAGE_FILENAME_ATTRIBUTE_NAME; @@ -63,6 +63,7 @@ import org.mastodon.graph.io.RawGraphIO; import org.mastodon.mamut.feature.MamutFeatureComputerService; import org.mastodon.mamut.feature.MamutRawFeatureModelIO; +import org.mastodon.mamut.io.importer.trackmate.MamutExporter; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Link; diff --git a/src/test/resources/org/mastodon/mamut/importer/FakeTracks.tif b/src/test/resources/org/mastodon/mamut/io/importer/FakeTracks.tif similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/FakeTracks.tif rename to src/test/resources/org/mastodon/mamut/io/importer/FakeTracks.tif diff --git a/src/test/resources/org/mastodon/mamut/importer/FakeTracks.xml b/src/test/resources/org/mastodon/mamut/io/importer/FakeTracks.xml similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/FakeTracks.xml rename to src/test/resources/org/mastodon/mamut/io/importer/FakeTracks.xml diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/FakeTracks.xml b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/FakeTracks.xml similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/FakeTracks.xml rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/FakeTracks.xml diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/FakeTracksBDV.h5 b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/FakeTracksBDV.h5 similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/FakeTracksBDV.h5 rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/FakeTracksBDV.h5 diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/FakeTracksBDV.xml b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/FakeTracksBDV.xml similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/FakeTracksBDV.xml rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/FakeTracksBDV.xml diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Link displacement.raw b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Link displacement.raw similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Link displacement.raw rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Link displacement.raw diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Link velocity.raw b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Link velocity.raw similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Link velocity.raw rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Link velocity.raw diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Spot center intensity.raw b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Spot center intensity.raw similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Spot center intensity.raw rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Spot center intensity.raw diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Spot intensity.raw b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Spot intensity.raw similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Spot intensity.raw rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Spot intensity.raw diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Spot quick mean.raw b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Spot quick mean.raw similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Spot quick mean.raw rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Spot quick mean.raw diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Spot radius.raw b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Spot radius.raw similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Spot radius.raw rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Spot radius.raw diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Spot track ID.raw b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Spot track ID.raw similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Spot track ID.raw rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Spot track ID.raw diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Track N spots.raw b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Track N spots.raw similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/features/Track N spots.raw rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/features/Track N spots.raw diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/gui.xml b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/gui.xml similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/gui.xml rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/gui.xml diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/model.raw b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/model.raw similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/model.raw rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/model.raw diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/project.xml b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/project.xml similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/project.xml rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/project.xml diff --git a/src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/tags.raw b/src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/tags.raw similarity index 100% rename from src/test/resources/org/mastodon/mamut/importer/trackmate/mamutproject/tags.raw rename to src/test/resources/org/mastodon/mamut/io/importer/trackmate/mamutproject/tags.raw From b3ed8a7bf2fe7601efc63f24c894746299e6a715 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 17 Aug 2023 16:45:33 +0200 Subject: [PATCH 017/220] Store style managers in a common map. Mainly as an effort to reduce the number of fields and methods in the window manager class. We began with just a manager for BDV and TrackScheme styles but now we have 5 of them. For now. Also this will make it easier to extend Mastodon with new views in the future. --- .../org/mastodon/mamut/MamutBranchView.java | 5 +- .../mastodon/mamut/MamutBranchViewBdv.java | 4 +- .../mamut/MamutBranchViewTrackScheme.java | 7 +- .../java/org/mastodon/mamut/MamutView.java | 5 +- .../java/org/mastodon/mamut/MamutViewBdv.java | 4 +- .../org/mastodon/mamut/MamutViewGrapher.java | 4 +- .../org/mastodon/mamut/MamutViewTable.java | 2 +- .../mastodon/mamut/MamutViewTrackScheme.java | 4 +- .../org/mastodon/mamut/WindowManager.java | 81 +++++++++---------- 9 files changed, 57 insertions(+), 59 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/MamutBranchView.java b/src/main/java/org/mastodon/mamut/MamutBranchView.java index 849fc7ee1..7d03d523e 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchView.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchView.java @@ -243,9 +243,8 @@ protected final ColoringModel registerBranchColoring( final Runnable refresh ) { final FeatureModel featureModel = appModel.getModel().getFeatureModel(); - final FeatureColorModeManager featureColorModeManager = appModel.getWindowManager().getFeatureColorModeManager(); - final ColoringModelBranchGraph< ?, ? > coloringModel = - new ColoringModelBranchGraph<>( tagSetModel, featureColorModeManager, featureModel ); + final FeatureColorModeManager featureColorModeManager = appModel.getWindowManager().getManager( FeatureColorModeManager.class ); + final ColoringModelBranchGraph< ?, ? > coloringModel = new ColoringModelBranchGraph<>( tagSetModel, featureColorModeManager, featureModel ); final ColoringMenu coloringMenu = new ColoringMenu( menuHandle.getMenu(), coloringModel ); tagSetModel.listeners().add( coloringModel ); diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java index 8229c2e1f..fba37bb49 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java @@ -80,6 +80,7 @@ import org.mastodon.views.bdv.overlay.OverlayNavigation; import org.mastodon.views.bdv.overlay.RenderSettings; import org.mastodon.views.bdv.overlay.RenderSettings.UpdateListener; +import org.mastodon.views.bdv.overlay.ui.RenderSettingsManager; import org.mastodon.views.bdv.overlay.wrap.OverlayEdgeWrapper; import org.mastodon.views.bdv.overlay.wrap.OverlayGraphWrapper; import org.mastodon.views.bdv.overlay.wrap.OverlayProperties; @@ -268,7 +269,8 @@ public MamutBranchViewBdv( final ProjectModel appModel, final Map< String, Objec timepointModel.listeners().add( () -> viewer.setTimepoint( timepointModel.getTimepoint() ) ); // Render settings. - final RenderSettings renderSettings = appModel.getWindowManager().getRenderSettingsManager().getForwardDefaultStyle(); + final RenderSettingsManager renderSettingsManager = appModel.getWindowManager().getManager( RenderSettingsManager.class ); + final RenderSettings renderSettings = renderSettingsManager.getForwardDefaultStyle(); tracksOverlay.setRenderSettings( renderSettings ); final UpdateListener updateListener = () -> viewer.repaint(); renderSettings.updateListeners().add( updateListener ); diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java index 94dd76b93..9562caf7a 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java @@ -88,6 +88,7 @@ import org.mastodon.views.trackscheme.display.TrackSchemeOverlay.TrackSchemeOverlayFactory; import org.mastodon.views.trackscheme.display.TrackSchemeZoom; import org.mastodon.views.trackscheme.display.style.TrackSchemeStyle; +import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleManager; import org.mastodon.views.trackscheme.wrap.DefaultModelGraphProperties; import org.mastodon.views.trackscheme.wrap.ModelGraphProperties; @@ -124,9 +125,9 @@ protected MamutBranchViewTrackScheme( new String[] { KeyConfigContexts.TRACKSCHEME } ); // TrackScheme options. - final GraphColorGeneratorAdapter< BranchSpot, BranchLink, TrackSchemeVertex, TrackSchemeEdge > coloringAdapter = - new GraphColorGeneratorAdapter<>( viewGraph.getVertexMap(), viewGraph.getEdgeMap() ); - final TrackSchemeStyle forwardDefaultStyle = appModel.getWindowManager().getTrackSchemeStyleManager().getForwardDefaultStyle(); + final GraphColorGeneratorAdapter< BranchSpot, BranchLink, TrackSchemeVertex, TrackSchemeEdge > coloringAdapter = new GraphColorGeneratorAdapter<>( viewGraph.getVertexMap(), viewGraph.getEdgeMap() ); + final TrackSchemeStyleManager trackSchemeStyleManager = appModel.getWindowManager().getManager( TrackSchemeStyleManager.class ); + final TrackSchemeStyle forwardDefaultStyle = trackSchemeStyleManager.getForwardDefaultStyle(); final TrackSchemeOptions options = TrackSchemeOptions.options() .trackSchemeOverlayFactory( overlayFactory ) .lineageTreeLayoutFactory( lineageTreeLayoutFactory ) diff --git a/src/main/java/org/mastodon/mamut/MamutView.java b/src/main/java/org/mastodon/mamut/MamutView.java index 470723419..2fe1cf141 100644 --- a/src/main/java/org/mastodon/mamut/MamutView.java +++ b/src/main/java/org/mastodon/mamut/MamutView.java @@ -156,10 +156,9 @@ protected ColoringModelMain< Spot, Link, BranchSpot, BranchLink > registerColori { final TagSetModel< Spot, Link > tagSetModel = appModel.getModel().getTagSetModel(); final FeatureModel featureModel = appModel.getModel().getFeatureModel(); - final FeatureColorModeManager featureColorModeManager = appModel.getWindowManager().getFeatureColorModeManager(); + final FeatureColorModeManager featureColorModeManager = appModel.getWindowManager().getManager( FeatureColorModeManager.class ); final ModelBranchGraph branchGraph = appModel.getModel().getBranchGraph(); - final ColoringModelMain< Spot, Link, BranchSpot, BranchLink > coloringModel = - new ColoringModelMain<>( tagSetModel, featureColorModeManager, featureModel, branchGraph ); + final ColoringModelMain< Spot, Link, BranchSpot, BranchLink > coloringModel = new ColoringModelMain<>( tagSetModel, featureColorModeManager, featureModel, branchGraph ); final ColoringMenu coloringMenu = new ColoringMenu( menuHandle.getMenu(), coloringModel ); tagSetModel.listeners().add( coloringModel ); diff --git a/src/main/java/org/mastodon/mamut/MamutViewBdv.java b/src/main/java/org/mastodon/mamut/MamutViewBdv.java index edb7d0e11..81493321a 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutViewBdv.java @@ -84,6 +84,7 @@ import org.mastodon.views.bdv.overlay.OverlayNavigation; import org.mastodon.views.bdv.overlay.RenderSettings; import org.mastodon.views.bdv.overlay.RenderSettings.UpdateListener; +import org.mastodon.views.bdv.overlay.ui.RenderSettingsManager; import org.mastodon.views.bdv.overlay.wrap.OverlayEdgeWrapper; import org.mastodon.views.bdv.overlay.wrap.OverlayGraphWrapper; import org.mastodon.views.bdv.overlay.wrap.OverlayVertexWrapper; @@ -290,7 +291,8 @@ public MamutViewBdv( final ProjectModel appModel, final Map< String, Object > gu viewer.timePointListeners().add( timePointIndex -> timepointModel.setTimepoint( timePointIndex ) ); timepointModel.listeners().add( () -> viewer.setTimepoint( timepointModel.getTimepoint() ) ); - final RenderSettings renderSettings = appModel.getWindowManager().getRenderSettingsManager().getForwardDefaultStyle(); + final RenderSettingsManager renderSettingsManager = appModel.getWindowManager().getManager( RenderSettingsManager.class ); + final RenderSettings renderSettings = renderSettingsManager.getForwardDefaultStyle(); tracksOverlay.setRenderSettings( renderSettings ); final UpdateListener updateListener = () -> { viewer.repaint(); diff --git a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java index 2ef31cf07..b6b6485c6 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java +++ b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java @@ -80,6 +80,7 @@ import org.mastodon.views.grapher.display.FeatureSpecPair; import org.mastodon.views.grapher.display.OffsetAxes; import org.mastodon.views.grapher.display.style.DataDisplayStyle; +import org.mastodon.views.grapher.display.style.DataDisplayStyleManager; import org.mastodon.views.trackscheme.display.ColorBarOverlay; import org.mastodon.views.trackscheme.display.ColorBarOverlay.Position; import org.mastodon.views.trackscheme.display.TrackSchemeNavigationActions; @@ -144,7 +145,8 @@ public MamutViewGrapher( final ProjectModel appModel, final Map< String, Object * Show the frame */ - final DataDisplayStyle forwardDefaultStyle = appModel.getWindowManager().getDataDisplayStyleManager().getForwardDefaultStyle(); + final DataDisplayStyleManager dataDisplayStyleManager = appModel.getWindowManager().getManager( DataDisplayStyleManager.class ); + final DataDisplayStyle forwardDefaultStyle = dataDisplayStyleManager.getForwardDefaultStyle(); coloringAdapter = new GraphColorGeneratorAdapter<>( viewGraph.getVertexMap(), viewGraph.getEdgeMap() ); final DataDisplayOptions options = DataDisplayOptions.options() .shareKeyPressedEvents( keyPressedManager ) diff --git a/src/main/java/org/mastodon/mamut/MamutViewTable.java b/src/main/java/org/mastodon/mamut/MamutViewTable.java index b849bbae1..a205c33fc 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTable.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTable.java @@ -329,7 +329,7 @@ private static final ColoringModel registerBranchColoring( { final TagSetModel< Spot, Link > tagSetModel = appModel.getModel().getTagSetModel(); final FeatureModel featureModel = appModel.getModel().getFeatureModel(); - final FeatureColorModeManager featureColorModeManager = appModel.getWindowManager().getFeatureColorModeManager(); + final FeatureColorModeManager featureColorModeManager = appModel.getWindowManager().getManager( FeatureColorModeManager.class ); final ColoringModelBranchGraph< ?, ? > coloringModel = new ColoringModelBranchGraph<>( tagSetModel, featureColorModeManager, featureModel ); final ColoringMenu coloringMenu = new ColoringMenu( menuHandle.getMenu(), coloringModel ); diff --git a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java index 251a752f8..cf4a009f0 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java @@ -81,6 +81,7 @@ import org.mastodon.views.trackscheme.display.TrackSchemePanel; import org.mastodon.views.trackscheme.display.TrackSchemeZoom; import org.mastodon.views.trackscheme.display.style.TrackSchemeStyle; +import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleManager; import org.scijava.ui.behaviour.KeyPressedManager; public class MamutViewTrackScheme @@ -136,7 +137,8 @@ public MamutViewTrackScheme( final ProjectModel appModel, final Map< String, Obj /* * show TrackSchemeFrame */ - final TrackSchemeStyle forwardDefaultStyle = appModel.getWindowManager().getTrackSchemeStyleManager().getForwardDefaultStyle(); + final TrackSchemeStyleManager trackSchemeStyleManager = appModel.getWindowManager().getManager( TrackSchemeStyleManager.class ); + final TrackSchemeStyle forwardDefaultStyle = trackSchemeStyleManager.getForwardDefaultStyle(); coloringAdapter = new GraphColorGeneratorAdapter<>( viewGraph.getVertexMap(), viewGraph.getEdgeMap() ); final TrackSchemeOptions options = TrackSchemeOptions.options() .shareKeyPressedEvents( keyPressedManager ) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 29dc66f15..14254ddc1 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -137,9 +137,7 @@ public class WindowManager /** All currently open branch TrackScheme windows. */ private final List< MamutBranchViewBdv > bbdvWindows = new ArrayList<>(); - /** - * The {@link ContextProvider}s of all currently open BigDataViewer windows. - */ + /** The {@link ContextProvider}s of all currently open BigDataViewer windows. */ private final List< ContextProvider< Spot > > contextProviders = new ArrayList<>(); /** All currently open TrackScheme windows. */ @@ -154,15 +152,8 @@ public class WindowManager /** All currently open Grapher windows. */ private final List< MamutViewGrapher > grapherWindows = new ArrayList<>(); - private final TrackSchemeStyleManager trackSchemeStyleManager; - - private final DataDisplayStyleManager dataDisplayStyleManager; - - private final RenderSettingsManager renderSettingsManager; - - private final FeatureColorModeManager featureColorModeManager; - - private final MamutFeatureProjectionsManager featureProjectionsManager; + /** Stores the various managers used to manage view styles, features, etc. */ + private final Map< Class< ? >, Object > managers = new HashMap<>(); private final TagSetDialog tagSetDialog; @@ -184,14 +175,21 @@ public class WindowManager public WindowManager( final ProjectModel appModel ) { this.appModel = appModel; - this.trackSchemeStyleManager = new TrackSchemeStyleManager(); - this.dataDisplayStyleManager = new DataDisplayStyleManager(); - this.renderSettingsManager = new RenderSettingsManager(); - this.featureColorModeManager = new FeatureColorModeManager(); final Context context = appModel.getContext(); - this.featureProjectionsManager = new MamutFeatureProjectionsManager( context.getService( FeatureSpecsService.class ), featureColorModeManager ); final Model model = appModel.getModel(); + + /* + * Create and store managers. + */ + + managers.put( TrackSchemeStyleManager.class, new TrackSchemeStyleManager() ); + managers.put( DataDisplayStyleManager.class, new DataDisplayStyleManager() ); + managers.put( RenderSettingsManager.class, new RenderSettingsManager() ); + final FeatureColorModeManager featureColorModeManager = new FeatureColorModeManager(); + managers.put( FeatureColorModeManager.class, featureColorModeManager); + final MamutFeatureProjectionsManager featureProjectionsManager = new MamutFeatureProjectionsManager( context.getService( FeatureSpecsService.class ), featureColorModeManager ); featureProjectionsManager.setModel( model, appModel.getSharedBdvData().getSources().size() ); + managers.put( MamutFeatureProjectionsManager.class, featureProjectionsManager ); final KeymapManager keymapManager = appModel.getKeymapManager(); final Keymap keymap = keymapManager.getForwardDefaultKeymap(); // TODO: still needed? @@ -233,9 +231,9 @@ public WindowManager( final ProjectModel appModel ) projectActions.namedAction( openOnlineDocumentation, OPEN_ONLINE_DOCUMENTATION_KEYS ); this.settings = new PreferencesDialog( null, keymap, new String[] { KeyConfigContexts.MASTODON } ); - settings.addPage( new TrackSchemeStyleSettingsPage( "TrackScheme Styles", trackSchemeStyleManager ) ); - settings.addPage( new RenderSettingsConfigPage( "BDV Render Settings", renderSettingsManager ) ); - settings.addPage( new DataDisplayStyleSettingsPage( "Grapher styles", dataDisplayStyleManager ) ); + settings.addPage( new TrackSchemeStyleSettingsPage( "TrackScheme Styles", getManager( TrackSchemeStyleManager.class ) ) ); + settings.addPage( new RenderSettingsConfigPage( "BDV Render Settings", getManager( RenderSettingsManager.class ) ) ); + settings.addPage( new DataDisplayStyleSettingsPage( "Grapher styles", getManager( DataDisplayStyleManager.class ) ) ); settings.addPage( new KeymapSettingsPage( "Keymap", keymapManager, descriptions ) ); settings.addPage( new FeatureColorModeConfigPage( "Feature Color Modes", featureColorModeManager, featureProjectionsManager, "Spot", "Link" ) ); @@ -251,6 +249,24 @@ public WindowManager( final ProjectModel appModel ) featureComputationDialog.setIconImages( FEATURES_ICON ); } + /** + * Returns the manager object of the specified class used in this window + * manager, or null if a manager of the specified class does + * not exist. + * + * @param + * the manager type. + * @param klass + * the manager class. + * @return the manager instance or null. + */ + public < T > T getManager( final Class< T > klass ) + { + @SuppressWarnings( "unchecked" ) + final T manager = ( T ) managers.get( klass ); + return manager; + } + private synchronized void addBdvWindow( final MamutViewBdv w ) { bdvWindows.add( w ); @@ -783,31 +799,6 @@ public void dispose() settings.dispose(); } - TrackSchemeStyleManager getTrackSchemeStyleManager() - { - return trackSchemeStyleManager; - } - - public DataDisplayStyleManager getDataDisplayStyleManager() - { - return dataDisplayStyleManager; - } - - RenderSettingsManager getRenderSettingsManager() - { - return renderSettingsManager; - } - - FeatureColorModeManager getFeatureColorModeManager() - { - return featureColorModeManager; - } - - MamutFeatureProjectionsManager getFeatureProjectionsManager() - { - return featureProjectionsManager; - } - public PreferencesDialog getPreferencesDialog() { return settings; From 226c838a41537f9886a57e575340918c6e13a66d Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 17 Aug 2023 17:43:07 +0200 Subject: [PATCH 018/220] Make an interface for views that have and use a context chooser. --- .../org/mastodon/mamut/MamutViewGrapher.java | 4 +++- .../java/org/mastodon/mamut/MamutViewTable.java | 4 +++- .../mastodon/mamut/MamutViewTrackScheme.java | 3 +++ .../views/context/HasContextChooser.java | 17 +++++++++++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/mastodon/views/context/HasContextChooser.java diff --git a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java index b6b6485c6..3a6a92ed7 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java +++ b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java @@ -65,6 +65,7 @@ import org.mastodon.ui.coloring.feature.FeatureColorMode; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.context.ContextChooser; +import org.mastodon.views.context.HasContextChooser; import org.mastodon.views.grapher.datagraph.DataContextListener; import org.mastodon.views.grapher.datagraph.DataEdge; import org.mastodon.views.grapher.datagraph.DataGraph; @@ -86,7 +87,7 @@ import org.mastodon.views.trackscheme.display.TrackSchemeNavigationActions; import org.scijava.ui.behaviour.KeyPressedManager; -public class MamutViewGrapher extends MamutView< DataGraph< Spot, Link >, DataVertex, DataEdge > +public class MamutViewGrapher extends MamutView< DataGraph< Spot, Link >, DataVertex, DataEdge > implements HasContextChooser< Spot > { /** @@ -324,6 +325,7 @@ else if ( null != featureColorModeName ) dataDisplayPanel.getDisplay().requestFocusInWindow(); } + @Override public ContextChooser< Spot > getContextChooser() { return contextChooser; diff --git a/src/main/java/org/mastodon/mamut/MamutViewTable.java b/src/main/java/org/mastodon/mamut/MamutViewTable.java index a205c33fc..c61583c3b 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTable.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTable.java @@ -83,6 +83,7 @@ import org.mastodon.ui.coloring.feature.FeatureColorModeManager; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.context.ContextChooser; +import org.mastodon.views.context.HasContextChooser; import org.mastodon.views.table.FeatureTagTablePanel; import org.mastodon.views.table.TableViewActions; import org.mastodon.views.table.TableViewFrameBuilder; @@ -90,7 +91,7 @@ import bdv.BigDataViewerActions; -public class MamutViewTable extends MamutView< ViewGraph< Spot, Link, Spot, Link >, Spot, Link > +public class MamutViewTable extends MamutView< ViewGraph< Spot, Link, Spot, Link >, Spot, Link > implements HasContextChooser< Spot > { /** @@ -423,6 +424,7 @@ public MyTableViewFrame getFrame() return vf; } + @Override @SuppressWarnings( "unchecked" ) public ContextChooser< Spot > getContextChooser() { diff --git a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java index cf4a009f0..1d5c94063 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java @@ -66,6 +66,7 @@ import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.context.ContextChooser; +import org.mastodon.views.context.HasContextChooser; import org.mastodon.views.trackscheme.ScreenTransform; import org.mastodon.views.trackscheme.TrackSchemeContextListener; import org.mastodon.views.trackscheme.TrackSchemeEdge; @@ -86,6 +87,7 @@ public class MamutViewTrackScheme extends MamutView< TrackSchemeGraph< Spot, Link >, TrackSchemeVertex, TrackSchemeEdge > + implements HasContextChooser< Spot > { /** @@ -303,6 +305,7 @@ public MamutViewTrackScheme( final ProjectModel appModel, final Map< String, Obj frame.getTrackschemePanel().getDisplay().requestFocusInWindow(); } + @Override public ContextChooser< Spot > getContextChooser() { return contextChooser; diff --git a/src/main/java/org/mastodon/views/context/HasContextChooser.java b/src/main/java/org/mastodon/views/context/HasContextChooser.java new file mode 100644 index 000000000..aa84113e8 --- /dev/null +++ b/src/main/java/org/mastodon/views/context/HasContextChooser.java @@ -0,0 +1,17 @@ +package org.mastodon.views.context; + +/** + * Interface for views that have a context chooser. + * + * @param + * the type of object the context is defined on. + */ +public interface HasContextChooser< T > +{ + /** + * Returns the context chooser of this view. + * + * @return the context chooser. + */ + public ContextChooser< T > getContextChooser(); +} From 73f13f42f93e233150318f7669c3d5357e88fec6 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 17 Aug 2023 17:49:19 +0200 Subject: [PATCH 019/220] Manage views and branch views in a common fields. The view lists are stored in a map, indexed by their class, like for the manager. This diminish the number of fields and methods in the window manager class. This also allows for treating views in a general manner without having to change too much code when a new view will be added. For this I shall find a way to create view instances in a generic manner, probably with a factory pattern. --- .../org/mastodon/mamut/WindowManager.java | 235 +++++++++--------- 1 file changed, 111 insertions(+), 124 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 14254ddc1..6f137856c 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -70,6 +70,7 @@ import org.mastodon.views.bdv.overlay.ui.RenderSettingsConfigPage; import org.mastodon.views.bdv.overlay.ui.RenderSettingsManager; import org.mastodon.views.context.ContextProvider; +import org.mastodon.views.context.HasContextChooser; import org.mastodon.views.grapher.display.style.DataDisplayStyleManager; import org.mastodon.views.grapher.display.style.DataDisplayStyleSettingsPage; import org.mastodon.views.trackscheme.ScreenTransform; @@ -110,8 +111,8 @@ public class WindowManager public static final String TAGSETS_DIALOG = "edit tag sets"; public static final String COMPUTE_FEATURE_DIALOG = "compute features"; public static final String OPEN_ONLINE_DOCUMENTATION = "open online documentation"; - static final String[] NEW_BDV_VIEW_KEYS = new String[] { "not mapped" }; + static final String[] NEW_BDV_VIEW_KEYS = new String[] { "not mapped" }; static final String[] NEW_TRACKSCHEME_VIEW_KEYS = new String[] { "not mapped" }; static final String[] NEW_TABLE_VIEW_KEYS = new String[] { "not mapped" }; static final String[] NEW_SELECTION_TABLE_VIEW_KEYS = new String[] { "not mapped" }; @@ -131,29 +132,21 @@ public class WindowManager public static final String DOCUMENTATION_URL = "https://mastodon.readthedocs.io/en/latest/"; - /** All currently open BigDataViewer windows. */ - private final List< MamutViewBdv > bdvWindows = new ArrayList<>(); - - /** All currently open branch TrackScheme windows. */ - private final List< MamutBranchViewBdv > bbdvWindows = new ArrayList<>(); - - /** The {@link ContextProvider}s of all currently open BigDataViewer windows. */ + /** + * The {@link ContextProvider}s of all currently open BigDataViewer windows. + */ private final List< ContextProvider< Spot > > contextProviders = new ArrayList<>(); - /** All currently open TrackScheme windows. */ - private final List< MamutViewTrackScheme > tsWindows = new ArrayList<>(); - - /** All currently open branch TrackScheme windows. */ - private final List< MamutBranchViewTrackScheme > btsWindows = new ArrayList<>(); + /** + * Stores the various managers used to manage view styles, features, etc. + */ + private final Map< Class< ? >, Object > managers = new HashMap<>(); - /** All currently open Table windows. */ - private final List< MamutViewTable > tableWindows = new ArrayList<>(); + /** Stores the different lists of mamut views currently opened. */ + private final Map< Class< ? extends MamutView< ?, ?, ? > >, List< MamutView< ?, ?, ? > > > mamutViews = new HashMap<>(); - /** All currently open Grapher windows. */ - private final List< MamutViewGrapher > grapherWindows = new ArrayList<>(); - - /** Stores the various managers used to manage view styles, features, etc. */ - private final Map< Class< ? >, Object > managers = new HashMap<>(); + /** Stores the different lists of mamut branch views currently opened. */ + private final Map< Class< ? extends MamutBranchView< ?, ?, ? > >, List< MamutBranchView< ?, ?, ? > > > mamutBranchViews = new HashMap<>(); private final TagSetDialog tagSetDialog; @@ -178,6 +171,28 @@ public WindowManager( final ProjectModel appModel ) final Context context = appModel.getContext(); final Model model = appModel.getModel(); + /* + * Create and store window lists. + */ + + @SuppressWarnings( "unchecked" ) + final Class< MamutView< ?, ?, ? > >[] knownMamutViewTypes = new Class[] { + MamutViewBdv.class, + MamutViewTrackScheme.class, + MamutViewTable.class, + MamutViewGrapher.class + }; + for ( final Class< MamutView< ?, ?, ? > > klass : knownMamutViewTypes ) + mamutViews.put( klass, new ArrayList<>() ); + + @SuppressWarnings( "unchecked" ) + final Class< MamutBranchView< ?, ?, ? > >[] knownMamutBranchViewTypes = new Class[] { + MamutBranchViewBdv.class, + MamutBranchViewTrackScheme.class, + }; + for ( final Class< MamutBranchView< ?, ?, ? > > klass : knownMamutBranchViewTypes ) + mamutBranchViews.put( klass, new ArrayList<>() ); + /* * Create and store managers. */ @@ -186,7 +201,7 @@ public WindowManager( final ProjectModel appModel ) managers.put( DataDisplayStyleManager.class, new DataDisplayStyleManager() ); managers.put( RenderSettingsManager.class, new RenderSettingsManager() ); final FeatureColorModeManager featureColorModeManager = new FeatureColorModeManager(); - managers.put( FeatureColorModeManager.class, featureColorModeManager); + managers.put( FeatureColorModeManager.class, featureColorModeManager ); final MamutFeatureProjectionsManager featureProjectionsManager = new MamutFeatureProjectionsManager( context.getService( FeatureSpecsService.class ), featureColorModeManager ); featureProjectionsManager.setModel( model, appModel.getSharedBdvData().getSources().size() ); managers.put( MamutFeatureProjectionsManager.class, featureProjectionsManager ); @@ -267,111 +282,119 @@ public < T > T getManager( final Class< T > klass ) return manager; } + /** + * Returns the list of opened mamut views of the specified type, or + * null if a view of this type is not registered. + * + * @param + * the view type, must extend {@link MamutView}. + * @param klass + * the view class, must extend {@link MamutView}. + * @return the list of view of specified class, or null. + */ + private < T extends MamutView< ?, ?, ? > > List< T > getViewList( final Class< T > klass ) + { + @SuppressWarnings( "unchecked" ) + final List< T > list = ( List< T > ) mamutViews.get( klass ); + return list; + } + + /** + * Returns the list of opened mamut branch views of the specified type, or + * null if a view of this type is not registered. + * + * @param + * the view type, must extend {@link MamutBranchView}. + * @param klass + * the view class, must extend {@link MamutBranchView}. + * @return the list of view of specified class, or null. + */ + private < T extends MamutBranchView< ?, ?, ? > > List< T > getBranchViewList( final Class< T > klass ) + { + @SuppressWarnings( "unchecked" ) + final List< T > list = ( List< T > ) mamutBranchViews.get( klass ); + return list; + } + private synchronized void addBdvWindow( final MamutViewBdv w ) { - bdvWindows.add( w ); + getViewList( MamutViewBdv.class ).add( w ); contextProviders.add( w.getContextProvider() ); - for ( final MamutViewTrackScheme tsw : tsWindows ) - tsw.getContextChooser().updateContextProviders( contextProviders ); - for ( final MamutViewTable tw : tableWindows ) - tw.getContextChooser().updateContextProviders( contextProviders ); - for ( final MamutViewGrapher gw : grapherWindows ) - gw.getContextChooser().updateContextProviders( contextProviders ); + forEachView( v -> { + if ( v instanceof HasContextChooser ) + { + @SuppressWarnings( "unchecked" ) + final HasContextChooser< Spot > cc = ( HasContextChooser< Spot > ) v; + cc.getContextChooser().updateContextProviders( contextProviders ); + } + } ); + w.onClose( () -> { - bdvWindows.remove( w ); + getViewList( MamutViewBdv.class ).remove( w ); contextProviders.remove( w.getContextProvider() ); - for ( final MamutViewTrackScheme tsw : tsWindows ) - tsw.getContextChooser().updateContextProviders( contextProviders ); - for ( final MamutViewTable tw : tableWindows ) - tw.getContextChooser().updateContextProviders( contextProviders ); + forEachView( v -> { + if ( v instanceof HasContextChooser ) + { + @SuppressWarnings( "unchecked" ) + final HasContextChooser< Spot > cc = ( HasContextChooser< Spot > ) v; + cc.getContextChooser().updateContextProviders( contextProviders ); + } + } ); } ); } private synchronized void addBBdvWindow( final MamutBranchViewBdv w ) { - bbdvWindows.add( w ); - w.onClose( () -> bbdvWindows.remove( w ) ); + getBranchViewList( MamutBranchViewBdv.class ).add( w ); + w.onClose( () -> getBranchViewList( MamutBranchViewBdv.class ).remove( w ) ); } private synchronized void addTsWindow( final MamutViewTrackScheme w ) { - tsWindows.add( w ); + getViewList( MamutViewTrackScheme.class ).add( w ); w.getContextChooser().updateContextProviders( contextProviders ); w.onClose( () -> { - tsWindows.remove( w ); + getViewList( MamutViewTrackScheme.class ).remove( w ); w.getContextChooser().updateContextProviders( new ArrayList<>() ); } ); } private synchronized void addBTsWindow( final MamutBranchViewTrackScheme w ) { - btsWindows.add( w ); - w.onClose( () -> btsWindows.remove( w ) ); + getBranchViewList( MamutBranchViewTrackScheme.class ).add( w ); + w.onClose( () -> getBranchViewList( MamutBranchViewTrackScheme.class ).remove( w ) ); } private synchronized void addTableWindow( final MamutViewTable table ) { - tableWindows.add( table ); + getViewList( MamutViewTable.class ).add( table ); table.getContextChooser().updateContextProviders( contextProviders ); table.onClose( () -> { - tableWindows.remove( table ); + getViewList( MamutViewTable.class ).remove( table ); table.getContextChooser().updateContextProviders( new ArrayList<>() ); } ); } private synchronized void addGrapherWindow( final MamutViewGrapher grapher ) { - grapherWindows.add( grapher ); + getViewList( MamutViewGrapher.class ).add( grapher ); grapher.getContextChooser().updateContextProviders( contextProviders ); grapher.onClose( () -> { - grapherWindows.remove( grapher ); + getViewList( MamutViewGrapher.class ).remove( grapher ); grapher.getContextChooser().updateContextProviders( new ArrayList<>() ); } ); } /** - * Executes the specified action for all the currently opened BDV views. + * Executes the specified action for all the currently opened mamut views of + * the specified class. * * @param action * the action to execute. */ - public void forEachBdvView( final Consumer< ? super MamutViewBdv > action ) + public < T extends MamutView< ?, ?, ? > > void forEachView( final Consumer< T > action, final Class< T > klass ) { - bdvWindows.forEach( action ); - } - - /** - * Executes the specified action for all the currently opened Table views. - * - * @param action - * the action to execute. - */ - public void forEachTableView( final Consumer< ? super MamutViewTable > action ) - { - tableWindows.forEach( action ); - } - - /** - * Executes the specified action for all the currently opened Grapher views. - * - * @param action - * the action to execute. - */ - public void forEachGrapherView( final Consumer< ? super MamutViewGrapher > action ) - { - grapherWindows.forEach( action ); - } - - /** - * Executes the specified action for all the currently opened TrackScheme - * views. - * - * @param action - * the action to execute. - */ - public void forEachTrackSchemeView( final Consumer< ? super MamutViewTrackScheme > action ) - { - tsWindows.forEach( action ); + getViewList( klass ).forEach( action ); } /** @@ -381,39 +404,24 @@ public void forEachTrackSchemeView( final Consumer< ? super MamutViewTrackScheme * @param action * the action to execute. */ - public void forEachBranchTrackSchemeView( final Consumer< ? super MamutBranchViewTrackScheme > action ) - { - btsWindows.forEach( action ); - } - - /** - * Executes the specified action for all the currently opened Branch-BDV - * views. - * - * @param action - * the action to execute. - */ - private void forEachBranchBdvView( final Consumer< ? super MamutBranchViewBdv > action ) + public < T extends MamutBranchView< ?, ?, ? > > void forEachBranchView( final Consumer< T > action, final Class< T > klass ) { - bbdvWindows.forEach( action ); + getBranchViewList( klass ).forEach( action ); } /** - * Executes the specified action for all the currently opened views. + * Executes the specified action for all the currently opened mamut views. * * @param action * the action to execute. */ public void forEachView( final Consumer< ? super MamutView< ?, ?, ? > > action ) { - forEachBdvView( action ); - forEachTrackSchemeView( action ); - forEachTableView( action ); - forEachGrapherView( action ); + mamutViews.forEach( ( k, l ) -> l.forEach( action ) ); } /** - * Executes the specified action for all the currently opened branch-graph + * Executes the specified action for all the currently opened mamut branch * views. * * @param action @@ -421,8 +429,7 @@ public void forEachView( final Consumer< ? super MamutView< ?, ?, ? > > action ) */ public void forEachBranchView( final Consumer< ? super MamutBranchView< ?, ?, ? > > action ) { - forEachBranchBdvView( action ); - forEachBranchTrackSchemeView( action ); + mamutBranchViews.forEach( ( k, l ) -> l.forEach( action ) ); } /** @@ -757,18 +764,8 @@ public void computeFeatures() public void closeAllWindows() { final ArrayList< Window > windows = new ArrayList<>(); - for ( final MamutViewBdv w : bdvWindows ) - windows.add( w.getFrame() ); - for ( final MamutBranchViewBdv w : bbdvWindows ) - windows.add( w.getFrame() ); - for ( final MamutViewTrackScheme w : tsWindows ) - windows.add( w.getFrame() ); - for ( final MamutBranchViewTrackScheme w : btsWindows ) - windows.add( w.getFrame() ); - for ( final MamutViewTable w : tableWindows ) - windows.add( w.getFrame() ); - for ( final MamutViewGrapher w : grapherWindows ) - windows.add( w.getFrame() ); + forEachView( v -> windows.add( v.getFrame() ) ); + forEachBranchView( v -> windows.add( v.getFrame() ) ); windows.add( tagSetDialog ); windows.add( featureComputationDialog ); @@ -804,16 +801,6 @@ public PreferencesDialog getPreferencesDialog() return settings; } - /** - * Exposes currently open BigDataViewer windows. - * - * @return a {@link List} of {@link MamutViewBdv}. - */ - public List< MamutViewBdv > getBdvWindows() - { - return bdvWindows; - } - private CommandDescriptions buildCommandDescriptions() { final CommandDescriptionsBuilder builder = new CommandDescriptionsBuilder(); From c737102dd9e7b28337784adf5153b2b3373b1248 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 17 Aug 2023 17:49:33 +0200 Subject: [PATCH 020/220] Remoe unused import. --- .../mastodon/mamut/io/importer/trackmate/MaMuTExporterTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/mastodon/mamut/io/importer/trackmate/MaMuTExporterTest.java b/src/test/java/org/mastodon/mamut/io/importer/trackmate/MaMuTExporterTest.java index 945a8702b..9bff54413 100644 --- a/src/test/java/org/mastodon/mamut/io/importer/trackmate/MaMuTExporterTest.java +++ b/src/test/java/org/mastodon/mamut/io/importer/trackmate/MaMuTExporterTest.java @@ -63,7 +63,6 @@ import org.mastodon.graph.io.RawGraphIO; import org.mastodon.mamut.feature.MamutFeatureComputerService; import org.mastodon.mamut.feature.MamutRawFeatureModelIO; -import org.mastodon.mamut.io.importer.trackmate.MamutExporter; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Link; From 20b7bfd5ea1b0d4fa3bdfc7e7688847523fe12f4 Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Thu, 17 Aug 2023 20:57:23 +0200 Subject: [PATCH 021/220] Rework a bit the forEeach methods of the window manager. --- .../org/mastodon/mamut/WindowManager.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 6f137856c..3d635e68f 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -47,6 +47,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.function.Consumer; import javax.swing.JDialog; @@ -391,22 +392,30 @@ private synchronized void addGrapherWindow( final MamutViewGrapher grapher ) * * @param action * the action to execute. + * @param klass + * the view class. */ - public < T extends MamutView< ?, ?, ? > > void forEachView( final Consumer< T > action, final Class< T > klass ) + public < T extends MamutView< ?, ?, ? > > void forEachView( final Class< T > klass, final Consumer< T > action ) { - getViewList( klass ).forEach( action ); + Optional.of( getViewList( klass ) ) + .orElse( Collections.emptyList() ) + .forEach( action ); } /** - * Executes the specified action for all the currently opened - * Branch-TrackScheme views. + * Executes the specified action for all the currently opened branch views + * of the specified class. * * @param action * the action to execute. + * @param klass + * the view class. */ - public < T extends MamutBranchView< ?, ?, ? > > void forEachBranchView( final Consumer< T > action, final Class< T > klass ) + public < T extends MamutBranchView< ?, ?, ? > > void forEachBranchView( final Class< T > klass, final Consumer< T > action ) { - getBranchViewList( klass ).forEach( action ); + Optional.of( getBranchViewList( klass ) ) + .orElse( Collections.emptyList() ) + .forEach( action ); } /** From 021a9616607c36c64dea278a7c04893ce405446d Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Thu, 17 Aug 2023 21:05:35 +0200 Subject: [PATCH 022/220] Remove the now empty settings menu in bdv views. --- .../java/org/mastodon/mamut/MamutBranchViewBdv.java | 6 +----- .../java/org/mastodon/mamut/MamutMenuBuilder.java | 2 -- src/main/java/org/mastodon/mamut/MamutViewBdv.java | 11 +++-------- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java index fba37bb49..9533dafe9 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java @@ -49,7 +49,6 @@ import org.mastodon.app.ui.MastodonFrameViewActions; import org.mastodon.app.ui.SearchVertexLabel; import org.mastodon.app.ui.ViewMenu; -import org.mastodon.app.ui.ViewMenuBuilder; import org.mastodon.app.ui.ViewMenuBuilder.JMenuHandle; import org.mastodon.graph.GraphIdBimap; import org.mastodon.mamut.model.BoundingSphereRadiusStatistics; @@ -158,10 +157,7 @@ public MamutBranchViewBdv( final ProjectModel appModel, final Map< String, Objec item( SelectionActions.SELECT_TRACK_DOWNWARD ), item( SelectionActions.SELECT_TRACK_UPWARD ), separator(), - tagSetMenu( tagSetMenuHandle ) ), - ViewMenuBuilder.menu( "Settings", - item( BigDataViewerActions.BRIGHTNESS_SETTINGS ), - item( BigDataViewerActions.VISIBILITY_AND_GROUPING ) ) ); + tagSetMenu( tagSetMenuHandle ) ) ); appModel.getPlugins().addMenus( menu ); // Register coloring and tag-sets. diff --git a/src/main/java/org/mastodon/mamut/MamutMenuBuilder.java b/src/main/java/org/mastodon/mamut/MamutMenuBuilder.java index 62b9c01b8..4058cb716 100644 --- a/src/main/java/org/mastodon/mamut/MamutMenuBuilder.java +++ b/src/main/java/org/mastodon/mamut/MamutMenuBuilder.java @@ -92,8 +92,6 @@ public class MamutMenuBuilder extends ViewMenuBuilder menuTexts.put( BigDataViewerActions.LOAD_SETTINGS, "Load Bdv Settings" ); menuTexts.put( BigDataViewerActions.SAVE_SETTINGS, "Save Bdv Settings" ); - menuTexts.put( BigDataViewerActions.BRIGHTNESS_SETTINGS, "Brightness & Color" ); - menuTexts.put( BigDataViewerActions.VISIBILITY_AND_GROUPING, "Visibility & Grouping" ); menuTexts.put( RecordMovieDialog.RECORD_MOVIE_DIALOG, "Record BDV movie" ); menuTexts.put( RecordMaxProjectionMovieDialog.RECORD_MIP_MOVIE_DIALOG, "Record BDV max projection movie" ); diff --git a/src/main/java/org/mastodon/mamut/MamutViewBdv.java b/src/main/java/org/mastodon/mamut/MamutViewBdv.java index 81493321a..9fe0938e4 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutViewBdv.java @@ -47,7 +47,6 @@ import org.mastodon.app.ui.MastodonFrameViewActions; import org.mastodon.app.ui.SearchVertexLabel; import org.mastodon.app.ui.ViewMenu; -import org.mastodon.app.ui.ViewMenuBuilder; import org.mastodon.app.ui.ViewMenuBuilder.JMenuHandle; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; @@ -176,7 +175,7 @@ public MamutViewBdv( final ProjectModel appModel, final Map< String, Object > gu * We have to build the coloring menu handles now. But the other actions * need to be included in the menus later, after they have been * installed (otherwise they won't be active). To keep the future menu - * order, we build an empty menu but already with all su-bmenus in + * order, we build an empty menu but already with all sub-menus in * order. */ final JMenuHandle menuHandle = new JMenuHandle(); @@ -189,8 +188,7 @@ public MamutViewBdv( final ProjectModel appModel, final Map< String, Object > gu viewMenu( colorMenu( menuHandle ), colorbarMenu( colorbarMenuHandle ) ), - editMenu(), - ViewMenuBuilder.menu( "Settings" ) ); + editMenu() ); // The view panel. viewer = bdv.getViewer(); @@ -331,10 +329,7 @@ public MamutViewBdv( final ProjectModel appModel, final Map< String, Object > gu item( SelectionActions.SELECT_TRACK_DOWNWARD ), item( SelectionActions.SELECT_TRACK_UPWARD ), separator(), - tagSetMenu( tagSetMenuHandle ) ), - ViewMenuBuilder.menu( "Settings", - item( BigDataViewerActions.BRIGHTNESS_SETTINGS ), - item( BigDataViewerActions.VISIBILITY_AND_GROUPING ) ) ); + tagSetMenu( tagSetMenuHandle ) ) ); appModel.getPlugins().addMenus( menu ); registerTagSetMenu( tagSetMenuHandle, From 87f5121277c35417907886f85b1b74eed4bb4731 Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Thu, 17 Aug 2023 21:09:09 +0200 Subject: [PATCH 023/220] Fix the size of the feature color mode panel. --- .../org/mastodon/feature/ui/FeatureColorModeEditorPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mastodon/feature/ui/FeatureColorModeEditorPanel.java b/src/main/java/org/mastodon/feature/ui/FeatureColorModeEditorPanel.java index c14b1e9e6..e899596b2 100644 --- a/src/main/java/org/mastodon/feature/ui/FeatureColorModeEditorPanel.java +++ b/src/main/java/org/mastodon/feature/ui/FeatureColorModeEditorPanel.java @@ -87,7 +87,7 @@ public FeatureColorModeEditorPanel( final String vertexName, final String edgeName ) { - setPreferredSize( new Dimension( 400, 550 ) ); + setPreferredSize( new Dimension( 550, 550 ) ); this.mode = mode; final GridBagLayout layout = new GridBagLayout(); From d276faa38824383420c10009a949a7ec59283781 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 18 Aug 2023 15:03:18 +0200 Subject: [PATCH 024/220] Move ColorBarOverlay in a more suitable package. --- src/main/java/org/mastodon/mamut/MamutBranchView.java | 4 ++-- src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java | 2 +- .../java/org/mastodon/mamut/MamutBranchViewTrackScheme.java | 2 +- src/main/java/org/mastodon/mamut/MamutView.java | 4 ++-- src/main/java/org/mastodon/mamut/MamutViewBdv.java | 2 +- src/main/java/org/mastodon/mamut/MamutViewGrapher.java | 4 ++-- src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java | 2 +- src/main/java/org/mastodon/mamut/WindowManager.java | 2 +- .../org/mastodon/mamut/io/MamutViewStateSerialization.java | 4 ++-- .../trackscheme/display => ui/coloring}/ColorBarOverlay.java | 4 +--- .../org/mastodon/views/bdv/export/AbstractBDVRecorder.java | 2 +- .../org/mastodon/views/bdv/export/MovieFileBDVRecorder.java | 2 +- .../org/mastodon/views/bdv/export/PNGFolderBDVRecorder.java | 2 +- .../views/bdv/export/RecordMaxProjectionMovieDialog.java | 2 +- .../java/org/mastodon/views/bdv/export/RecordMovieDialog.java | 2 +- 15 files changed, 19 insertions(+), 21 deletions(-) rename src/main/java/org/mastodon/{views/trackscheme/display => ui/coloring}/ColorBarOverlay.java (98%) diff --git a/src/main/java/org/mastodon/mamut/MamutBranchView.java b/src/main/java/org/mastodon/mamut/MamutBranchView.java index 7d03d523e..3fce91d92 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchView.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchView.java @@ -70,6 +70,7 @@ import org.mastodon.model.branch.BranchGraphTagSetAdapter; import org.mastodon.model.tag.TagSetModel; import org.mastodon.ui.TagSetMenu; +import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColoringMenu; import org.mastodon.ui.coloring.ColoringModel; import org.mastodon.ui.coloring.ColoringModelBranchGraph; @@ -77,11 +78,10 @@ import org.mastodon.ui.coloring.GraphColorGenerator; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; import org.mastodon.ui.coloring.TagSetGraphColorGenerator; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; import org.mastodon.ui.keymap.Keymap; import org.mastodon.ui.keymap.Keymap.UpdateListener; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; -import org.mastodon.views.trackscheme.display.ColorBarOverlay.Position; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.Behaviours; import org.scijava.ui.behaviour.util.WrappedActionMap; diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java index 9533dafe9..66b2b51f9 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java @@ -64,6 +64,7 @@ import org.mastodon.ui.FocusActions; import org.mastodon.ui.HighlightBehaviours; import org.mastodon.ui.SelectionActions; +import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColoringModel; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; import org.mastodon.ui.keymap.KeyConfigContexts; @@ -84,7 +85,6 @@ import org.mastodon.views.bdv.overlay.wrap.OverlayGraphWrapper; import org.mastodon.views.bdv.overlay.wrap.OverlayProperties; import org.mastodon.views.bdv.overlay.wrap.OverlayVertexWrapper; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; import bdv.BigDataViewerActions; import bdv.tools.InitializeViewerState; diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java index 9562caf7a..d3ded9f08 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java @@ -66,6 +66,7 @@ import org.mastodon.ui.EditTagActions; import org.mastodon.ui.FocusActions; import org.mastodon.ui.SelectionActions; +import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColoringModel; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; import org.mastodon.ui.keymap.KeyConfigContexts; @@ -76,7 +77,6 @@ import org.mastodon.views.trackscheme.TrackSchemeGraph; import org.mastodon.views.trackscheme.TrackSchemeVertex; import org.mastodon.views.trackscheme.display.BranchTrackSchemeEditLabelAction; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; import org.mastodon.views.trackscheme.display.EditFocusVertexLabelAction; import org.mastodon.views.trackscheme.display.PaintBranchGraph; import org.mastodon.views.trackscheme.display.PaintDecorations; diff --git a/src/main/java/org/mastodon/mamut/MamutView.java b/src/main/java/org/mastodon/mamut/MamutView.java index 2fe1cf141..af38f4542 100644 --- a/src/main/java/org/mastodon/mamut/MamutView.java +++ b/src/main/java/org/mastodon/mamut/MamutView.java @@ -56,15 +56,15 @@ import org.mastodon.model.tag.TagSetModel; import org.mastodon.model.tag.TagSetStructure.TagSet; import org.mastodon.ui.TagSetMenu; +import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColoringMenu; import org.mastodon.ui.coloring.ColoringModel; import org.mastodon.ui.coloring.ColoringModelMain; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; import org.mastodon.ui.coloring.TagSetGraphColorGenerator; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.feature.FeatureColorMode; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; -import org.mastodon.views.trackscheme.display.ColorBarOverlay.Position; public class MamutView< VG extends ViewGraph< Spot, Link, V, E >, V extends Vertex< E >, E extends Edge< V > > extends MastodonFrameView< ProjectModel, VG, Spot, Link, V, E > diff --git a/src/main/java/org/mastodon/mamut/MamutViewBdv.java b/src/main/java/org/mastodon/mamut/MamutViewBdv.java index 9fe0938e4..d262a40e7 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutViewBdv.java @@ -63,6 +63,7 @@ import org.mastodon.ui.FocusActions; import org.mastodon.ui.HighlightBehaviours; import org.mastodon.ui.SelectionActions; +import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColoringModelMain; import org.mastodon.ui.coloring.GraphColorGenerator; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; @@ -88,7 +89,6 @@ import org.mastodon.views.bdv.overlay.wrap.OverlayGraphWrapper; import org.mastodon.views.bdv.overlay.wrap.OverlayVertexWrapper; import org.mastodon.views.context.ContextProvider; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; import bdv.BigDataViewerActions; import bdv.tools.InitializeViewerState; diff --git a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java index 3a6a92ed7..9dfdc9ff5 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java +++ b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java @@ -60,8 +60,10 @@ import org.mastodon.ui.EditTagActions; import org.mastodon.ui.FocusActions; import org.mastodon.ui.SelectionActions; +import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColoringModelMain; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.feature.FeatureColorMode; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.context.ContextChooser; @@ -82,8 +84,6 @@ import org.mastodon.views.grapher.display.OffsetAxes; import org.mastodon.views.grapher.display.style.DataDisplayStyle; import org.mastodon.views.grapher.display.style.DataDisplayStyleManager; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; -import org.mastodon.views.trackscheme.display.ColorBarOverlay.Position; import org.mastodon.views.trackscheme.display.TrackSchemeNavigationActions; import org.scijava.ui.behaviour.KeyPressedManager; diff --git a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java index 1d5c94063..59222abc5 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java @@ -62,6 +62,7 @@ import org.mastodon.ui.FocusActions; import org.mastodon.ui.HighlightBehaviours; import org.mastodon.ui.SelectionActions; +import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColoringModelMain; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; import org.mastodon.ui.keymap.KeyConfigContexts; @@ -72,7 +73,6 @@ import org.mastodon.views.trackscheme.TrackSchemeEdge; import org.mastodon.views.trackscheme.TrackSchemeGraph; import org.mastodon.views.trackscheme.TrackSchemeVertex; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; import org.mastodon.views.trackscheme.display.EditFocusVertexLabelAction; import org.mastodon.views.trackscheme.display.ShowSelectedTracksActions; import org.mastodon.views.trackscheme.display.ToggleLinkBehaviour; diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 3d635e68f..b9d1c9312 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -58,6 +58,7 @@ import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; import org.mastodon.model.tag.ui.TagSetDialog; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; import org.mastodon.ui.keymap.CommandDescriptionProvider; import org.mastodon.ui.keymap.CommandDescriptions; @@ -75,7 +76,6 @@ import org.mastodon.views.grapher.display.style.DataDisplayStyleManager; import org.mastodon.views.grapher.display.style.DataDisplayStyleSettingsPage; import org.mastodon.views.trackscheme.ScreenTransform; -import org.mastodon.views.trackscheme.display.ColorBarOverlay.Position; import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleManager; import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleSettingsPage; import org.scijava.Context; diff --git a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java index 17c0c2f0d..1bdff0f14 100644 --- a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java +++ b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java @@ -75,6 +75,8 @@ import org.mastodon.mamut.model.Spot; import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; +import org.mastodon.ui.coloring.ColorBarOverlay; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.ColoringModel; import org.mastodon.ui.coloring.ColoringModelMain; import org.mastodon.views.context.ContextChooser; @@ -82,8 +84,6 @@ import org.mastodon.views.grapher.display.DataDisplayPanel; import org.mastodon.views.table.FeatureTagTablePanel; import org.mastodon.views.trackscheme.ScreenTransform; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; -import org.mastodon.views.trackscheme.display.ColorBarOverlay.Position; import org.mastodon.views.trackscheme.display.TrackSchemePanel; import mpicbg.spim.data.XmlHelpers; diff --git a/src/main/java/org/mastodon/views/trackscheme/display/ColorBarOverlay.java b/src/main/java/org/mastodon/ui/coloring/ColorBarOverlay.java similarity index 98% rename from src/main/java/org/mastodon/views/trackscheme/display/ColorBarOverlay.java rename to src/main/java/org/mastodon/ui/coloring/ColorBarOverlay.java index 45867be03..1d5779b41 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/ColorBarOverlay.java +++ b/src/main/java/org/mastodon/ui/coloring/ColorBarOverlay.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.views.trackscheme.display; +package org.mastodon.ui.coloring; import java.awt.Color; import java.awt.FontMetrics; @@ -36,8 +36,6 @@ import org.mastodon.model.tag.TagSetStructure.Tag; import org.mastodon.model.tag.TagSetStructure.TagSet; -import org.mastodon.ui.coloring.ColorMap; -import org.mastodon.ui.coloring.ColoringModel; import org.mastodon.ui.coloring.feature.FeatureColorMode; import org.mastodon.ui.coloring.feature.FeatureProjectionId; diff --git a/src/main/java/org/mastodon/views/bdv/export/AbstractBDVRecorder.java b/src/main/java/org/mastodon/views/bdv/export/AbstractBDVRecorder.java index 0d2c98c1b..364cf778f 100644 --- a/src/main/java/org/mastodon/views/bdv/export/AbstractBDVRecorder.java +++ b/src/main/java/org/mastodon/views/bdv/export/AbstractBDVRecorder.java @@ -33,8 +33,8 @@ import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; +import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.views.bdv.overlay.OverlayGraphRenderer; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; import bdv.cache.CacheControl; import bdv.export.ProgressWriter; diff --git a/src/main/java/org/mastodon/views/bdv/export/MovieFileBDVRecorder.java b/src/main/java/org/mastodon/views/bdv/export/MovieFileBDVRecorder.java index 9793032f5..82d068dab 100644 --- a/src/main/java/org/mastodon/views/bdv/export/MovieFileBDVRecorder.java +++ b/src/main/java/org/mastodon/views/bdv/export/MovieFileBDVRecorder.java @@ -31,8 +31,8 @@ import java.awt.image.BufferedImage; import java.io.IOException; +import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.views.bdv.overlay.OverlayGraphRenderer; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; import bdv.export.ProgressWriter; import bdv.viewer.ViewerPanel; diff --git a/src/main/java/org/mastodon/views/bdv/export/PNGFolderBDVRecorder.java b/src/main/java/org/mastodon/views/bdv/export/PNGFolderBDVRecorder.java index 307a02381..51fb4d074 100644 --- a/src/main/java/org/mastodon/views/bdv/export/PNGFolderBDVRecorder.java +++ b/src/main/java/org/mastodon/views/bdv/export/PNGFolderBDVRecorder.java @@ -34,8 +34,8 @@ import javax.imageio.ImageIO; +import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.views.bdv.overlay.OverlayGraphRenderer; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; import bdv.export.ProgressWriter; import bdv.viewer.ViewerPanel; diff --git a/src/main/java/org/mastodon/views/bdv/export/RecordMaxProjectionMovieDialog.java b/src/main/java/org/mastodon/views/bdv/export/RecordMaxProjectionMovieDialog.java index 522a738e7..27f58f452 100644 --- a/src/main/java/org/mastodon/views/bdv/export/RecordMaxProjectionMovieDialog.java +++ b/src/main/java/org/mastodon/views/bdv/export/RecordMaxProjectionMovieDialog.java @@ -63,6 +63,7 @@ import javax.swing.event.ChangeListener; import org.mastodon.app.MastodonIcons; +import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.keymap.CommandDescriptionProvider; import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; @@ -73,7 +74,6 @@ import org.mastodon.ui.util.FileChooser.SelectionMode; import org.mastodon.views.bdv.BigDataViewerMamut; import org.mastodon.views.bdv.overlay.OverlayGraphRenderer; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; import org.scijava.plugin.Plugin; import org.scijava.prefs.DefaultPrefService; import org.scijava.ui.behaviour.util.Actions; diff --git a/src/main/java/org/mastodon/views/bdv/export/RecordMovieDialog.java b/src/main/java/org/mastodon/views/bdv/export/RecordMovieDialog.java index aa35001d1..8b638191a 100644 --- a/src/main/java/org/mastodon/views/bdv/export/RecordMovieDialog.java +++ b/src/main/java/org/mastodon/views/bdv/export/RecordMovieDialog.java @@ -63,6 +63,7 @@ import javax.swing.event.ChangeListener; import org.mastodon.app.MastodonIcons; +import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.keymap.CommandDescriptionProvider; import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; @@ -73,7 +74,6 @@ import org.mastodon.ui.util.FileChooser.SelectionMode; import org.mastodon.views.bdv.BigDataViewerMamut; import org.mastodon.views.bdv.overlay.OverlayGraphRenderer; -import org.mastodon.views.trackscheme.display.ColorBarOverlay; import org.scijava.plugin.Plugin; import org.scijava.prefs.DefaultPrefService; import org.scijava.ui.behaviour.util.Actions; From a2a4838f63509c5292ac2dc02aef3fd33aa2e083 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 18 Aug 2023 17:06:54 +0200 Subject: [PATCH 025/220] Interface for views that some special components. --- .../ui/coloring/HasColorBarOverlay.java | 16 ++++++++++++++++ .../mastodon/ui/coloring/HasColoringModel.java | 16 ++++++++++++++++ .../views/context/HasContextProvider.java | 18 ++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 src/main/java/org/mastodon/ui/coloring/HasColorBarOverlay.java create mode 100644 src/main/java/org/mastodon/ui/coloring/HasColoringModel.java create mode 100644 src/main/java/org/mastodon/views/context/HasContextProvider.java diff --git a/src/main/java/org/mastodon/ui/coloring/HasColorBarOverlay.java b/src/main/java/org/mastodon/ui/coloring/HasColorBarOverlay.java new file mode 100644 index 000000000..3311788e7 --- /dev/null +++ b/src/main/java/org/mastodon/ui/coloring/HasColorBarOverlay.java @@ -0,0 +1,16 @@ +package org.mastodon.ui.coloring; + +/** + * Interface for classes that have {@link ColorBarOverlay}. + */ +public interface HasColorBarOverlay +{ + + /** + * Returns the {@link ColorBarOverlay} of this view. + * + * @return the {@link ColorBarOverlay}. + */ + public ColorBarOverlay getColorBarOverlay(); + +} diff --git a/src/main/java/org/mastodon/ui/coloring/HasColoringModel.java b/src/main/java/org/mastodon/ui/coloring/HasColoringModel.java new file mode 100644 index 000000000..9beca5cdb --- /dev/null +++ b/src/main/java/org/mastodon/ui/coloring/HasColoringModel.java @@ -0,0 +1,16 @@ +package org.mastodon.ui.coloring; + +/** + * Interface for classes that have a {@link ColoringModel}. + */ +public interface HasColoringModel +{ + + /** + * Returns the {@link ColoringModel} of this view. + * + * @return the {@link ColoringModel}. + */ + public ColoringModel getColoringModel(); + +} diff --git a/src/main/java/org/mastodon/views/context/HasContextProvider.java b/src/main/java/org/mastodon/views/context/HasContextProvider.java new file mode 100644 index 000000000..b40859cb2 --- /dev/null +++ b/src/main/java/org/mastodon/views/context/HasContextProvider.java @@ -0,0 +1,18 @@ +package org.mastodon.views.context; + +import org.mastodon.mamut.model.Spot; + +/** + * Interface for classes that can return a {@link ContextProvider}. + */ +public interface HasContextProvider +{ + + /** + * Returns the {@link ContextProvider} of this class. + * + * @return the {@link ContextProvider}. + */ + public ContextProvider< Spot > getContextProvider(); + +} From fc960d52246e216b7c1a87702db53baa6e6dcc6f Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 18 Aug 2023 17:07:16 +0200 Subject: [PATCH 026/220] Use the right opn() method when opening a project from the launcher. --- src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java index 6b166c58e..94a332827 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java @@ -647,7 +647,7 @@ private void loadMastodonProject( final String projectPath ) try { - final ProjectModel appModel = ProjectLoader.open( file.getAbsolutePath(), context ); + final ProjectModel appModel = ProjectLoader.openWithDialog( file.getAbsolutePath(), context, this ); new MainWindow( appModel ).setVisible( true ); dispose(); /* From 65a2403603490675fc921a01aed57ef774d57bb7 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 18 Aug 2023 17:09:27 +0200 Subject: [PATCH 027/220] Tentative factory design for mamut views. We started with just 2 views (BDV and TrackScheme) but now there are enough of them is that it is worthwhile having some generic way of handling them. The next commits will be about coming with a sensible way of doing it. Ideally, we want to make it possible for 3rd parties to extends Mastodon with new views without having to recompile it. --- .../mamut/views/AbstractMamutViewFactory.java | 204 ++++++++++++++++++ .../mamut/views/MamutViewFactory.java | 60 ++++++ 2 files changed, 264 insertions(+) create mode 100644 src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java create mode 100644 src/main/java/org/mastodon/mamut/views/MamutViewFactory.java diff --git a/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java b/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java new file mode 100644 index 000000000..a21f9d49c --- /dev/null +++ b/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java @@ -0,0 +1,204 @@ +package org.mastodon.mamut.views; + +import static org.mastodon.mamut.MamutView.COLORBAR_POSITION_KEY; +import static org.mastodon.mamut.MamutView.COLORBAR_VISIBLE_KEY; +import static org.mastodon.mamut.MamutView.FEATURE_COLOR_MODE_KEY; +import static org.mastodon.mamut.MamutView.FRAME_POSITION_KEY; +import static org.mastodon.mamut.MamutView.GROUP_HANDLE_ID_KEY; +import static org.mastodon.mamut.MamutView.NO_COLORING_KEY; +import static org.mastodon.mamut.MamutView.SETTINGS_PANEL_VISIBLE_KEY; +import static org.mastodon.mamut.MamutView.TAG_SET_KEY; + +import java.awt.Rectangle; +import java.awt.Window; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.mastodon.app.ui.ViewFrame; +import org.mastodon.grouping.GroupHandle; +import org.mastodon.mamut.MamutView; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.model.tag.TagSetStructure.TagSet; +import org.mastodon.ui.coloring.ColorBarOverlay; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; +import org.mastodon.ui.coloring.ColoringModel; +import org.mastodon.ui.coloring.HasColorBarOverlay; +import org.mastodon.ui.coloring.HasColoringModel; +import org.mastodon.ui.coloring.feature.FeatureColorMode; + +public abstract class AbstractMamutViewFactory< T extends MamutView< ?, ?, ? > > implements MamutViewFactory< T > +{ + + @Override + public T show( final ProjectModel projectModel, final Map< String, Object > guiState ) + { + final T view = create( projectModel ); + restoreGuiState( view, guiState ); + view.getFrame().setVisible( true ); + return view; + } + + @Override + public void restoreGuiState( final T view, final Map< String, Object > guiState ) + { + restoreFramePosition( view.getFrame(), guiState ); + restoreSettingsPanelVisibility( view.getFrame(), guiState ); + restoreGroupHandle( view.getGroupHandle(), guiState ); + restoreColoringModel( view, guiState ); + restoreColorbarState( view, guiState ); + } + + @Override + public Map< String, Object > getGuiState( final T view ) + { + final Map< String, Object > guiState = new LinkedHashMap<>(); + + // View type -> TODO change so that we can fish the right factory when + // deserializing. + guiState.put( VIEW_TYPE_KEY, view.getClass().getSimpleName() ); + + // Frame position and size. + final Rectangle bounds = view.getFrame().getBounds(); + guiState.put( FRAME_POSITION_KEY, new int[] { + ( int ) bounds.getMinX(), + ( int ) bounds.getMinY(), + ( int ) bounds.getWidth(), + ( int ) bounds.getHeight() } ); + + // Lock groups. + guiState.put( GROUP_HANDLE_ID_KEY, view.getGroupHandle().getGroupId() ); + + // Settings panel visibility. + guiState.put( SETTINGS_PANEL_VISIBLE_KEY, view.getFrame().isSettingsPanelVisible() ); + + // Coloring. + getColoringState( view, guiState ); + + // Colorbar. + getColorBarOverlayState( view, guiState ); + + return guiState; + } + + /** + * Reads the coloring state of a view and stores it into the specified map. + * + * @param coloringModel + * the coloring model to read from. + * @param guiState + * the map to store it to. + */ + private static void getColoringState( final MamutView< ?, ?, ? > view, final Map< String, Object > guiState ) + { + if ( !( view instanceof HasColoringModel ) ) + return; + + final ColoringModel coloringModel = ( ( HasColoringModel ) view ).getColoringModel(); + final boolean noColoring = coloringModel.noColoring(); + guiState.put( NO_COLORING_KEY, noColoring ); + if ( !noColoring ) + if ( coloringModel.getTagSet() != null ) + guiState.put( TAG_SET_KEY, coloringModel.getTagSet().getName() ); + else if ( coloringModel.getFeatureColorMode() != null ) + guiState.put( FEATURE_COLOR_MODE_KEY, coloringModel.getFeatureColorMode().getName() ); + } + + private static void getColorBarOverlayState( final MamutView< ?, ?, ? > view, final Map< String, Object > guiState ) + { + if ( !( view instanceof HasColorBarOverlay ) ) + return; + + final ColorBarOverlay colorBarOverlay = ( ( HasColorBarOverlay ) view ).getColorBarOverlay(); + guiState.put( COLORBAR_VISIBLE_KEY, colorBarOverlay.isVisible() ); + guiState.put( COLORBAR_POSITION_KEY, colorBarOverlay.getPosition() ); + } + + /* + * Restore GUI state utilities. + */ + + private static void restoreColoringModel( final MamutView< ?, ?, ? > viewraw, final Map< String, Object > guiState ) + { + if ( guiState == null || ( !( viewraw instanceof HasColoringModel ) ) ) + return; + + final ColoringModel coloringModel = ( ( HasColoringModel ) viewraw ).getColoringModel(); + + final Boolean noColoring = ( Boolean ) guiState.get( NO_COLORING_KEY ); + if ( null != noColoring && noColoring ) + { + coloringModel.colorByNone(); + } + else + { + final String tagSetName = ( String ) guiState.get( TAG_SET_KEY ); + final String featureColorModeName = ( String ) guiState.get( FEATURE_COLOR_MODE_KEY ); + if ( null != tagSetName ) + { + for ( final TagSet tagSet : coloringModel.getTagSetStructure().getTagSets() ) + { + if ( tagSet.getName().equals( tagSetName ) ) + { + coloringModel.colorByTagSet( tagSet ); + break; + } + } + } + else if ( null != featureColorModeName ) + { + final List< FeatureColorMode > featureColorModes = new ArrayList<>(); + featureColorModes.addAll( coloringModel.getFeatureColorModeManager().getBuiltinStyles() ); + featureColorModes.addAll( coloringModel.getFeatureColorModeManager().getUserStyles() ); + for ( final FeatureColorMode featureColorMode : featureColorModes ) + { + if ( featureColorMode.getName().equals( featureColorModeName ) ) + { + coloringModel.colorByFeature( featureColorMode ); + break; + } + } + } + } + } + + private static void restoreColorbarState( final MamutView< ?, ?, ? > view, final Map< String, Object > guiState ) + { + if ( !( view instanceof HasColorBarOverlay ) ) + return; + + final ColorBarOverlay colorBarOverlay = ( ( HasColorBarOverlay ) view ).getColorBarOverlay(); + final boolean colorbarVisible = ( boolean ) guiState.getOrDefault( COLORBAR_VISIBLE_KEY, false ); + final Position colorbarPosition = + ( Position ) guiState.getOrDefault( COLORBAR_POSITION_KEY, Position.BOTTOM_RIGHT ); + colorBarOverlay.setVisible( colorbarVisible ); + colorBarOverlay.setPosition( colorbarPosition ); + } + + private static void restoreFramePosition( final Window frame, final Map< String, Object > guiState ) + { + final int[] pos = ( int[] ) guiState.get( FRAME_POSITION_KEY ); + if ( null != pos ) + frame.setBounds( pos[ 0 ], pos[ 1 ], pos[ 2 ], pos[ 3 ] ); + else + { + frame.setSize( 650, 400 ); + frame.setLocationRelativeTo( null ); + } + } + + private static void restoreGroupHandle( final GroupHandle groupHandle, final Map< String, Object > guiState ) + { + final Integer groupID = ( Integer ) guiState.get( GROUP_HANDLE_ID_KEY ); + if ( null != groupID ) + groupHandle.setGroupId( groupID.intValue() ); + } + + private static void restoreSettingsPanelVisibility( final ViewFrame frame, final Map< String, Object > guiState ) + { + final Boolean settingsPanelVisible = ( Boolean ) guiState.get( SETTINGS_PANEL_VISIBLE_KEY ); + if ( null != settingsPanelVisible ) + frame.setSettingsPanelVisible( settingsPanelVisible.booleanValue() ); + } +} diff --git a/src/main/java/org/mastodon/mamut/views/MamutViewFactory.java b/src/main/java/org/mastodon/mamut/views/MamutViewFactory.java new file mode 100644 index 000000000..0b1d99aeb --- /dev/null +++ b/src/main/java/org/mastodon/mamut/views/MamutViewFactory.java @@ -0,0 +1,60 @@ +package org.mastodon.mamut.views; + +import java.util.Map; + +import org.mastodon.mamut.MamutView; +import org.mastodon.mamut.ProjectModel; +import org.scijava.plugin.SciJavaPlugin; + +public interface MamutViewFactory< T extends MamutView< ?, ?, ? > > extends SciJavaPlugin +{ + + /** + * Key to the view type name. Value is a string. + */ + static final String VIEW_TYPE_KEY = "Type"; + + /** + * Creates a new view for the specified project model. + *

+ * The new view has default GUI state and is not shown. + * + * @param projectModel + * the project model. + * + * @return a new view. + */ + public T create( final ProjectModel projectModel ); + + /** + * Creates and shows a new view for the specified project model, and restore + * the GUI state stored in the specified map. + * + * @param projectModel + * the project model. + * @param guiState + * the GUI state map. + * @return a new view. + */ + public T show( final ProjectModel projectModel, final Map< String, Object > guiState ); + + /** + * Restores the GUI state stored in the specified map for the specified + * view. + * + * @param view + * the view. + * @param guiState + * the GUI state map. + */ + public void restoreGuiState( final T view, final Map< String, Object > guiState ); + + /** + * Serializes the current GUI state of the specified view in a map. + * + * @param view + * the view. + * @return a new map. + */ + public Map< String, Object > getGuiState( final T view ); +} From ff87422d39b63e4296c547627c2d9673274dc968 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 18 Aug 2023 17:10:26 +0200 Subject: [PATCH 028/220] Tentative factory for BDV views. --- .../mastodon/mamut/MamutBranchViewBdv.java | 4 +- .../java/org/mastodon/mamut/MamutViewBdv.java | 73 +++-------------- .../org/mastodon/mamut/WindowManager.java | 4 +- .../mamut/io/MamutViewStateSerialization.java | 18 ++++- .../mamut/views/bdv/MamutViewBdvFactory.java | 81 +++++++++++++++++++ 5 files changed, 114 insertions(+), 66 deletions(-) create mode 100644 src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java index 66b2b51f9..e4d4dee7e 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java @@ -36,8 +36,8 @@ import static org.mastodon.mamut.MamutMenuBuilder.fileMenu; import static org.mastodon.mamut.MamutMenuBuilder.tagSetMenu; import static org.mastodon.mamut.MamutMenuBuilder.viewMenu; -import static org.mastodon.mamut.MamutViewBdv.BDV_STATE_KEY; -import static org.mastodon.mamut.MamutViewBdv.BDV_TRANSFORM_KEY; +import static org.mastodon.mamut.views.bdv.MamutViewBdvFactory.BDV_STATE_KEY; +import static org.mastodon.mamut.views.bdv.MamutViewBdvFactory.BDV_TRANSFORM_KEY; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/org/mastodon/mamut/MamutViewBdv.java b/src/main/java/org/mastodon/mamut/MamutViewBdv.java index d262a40e7..fb0122211 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutViewBdv.java @@ -28,6 +28,7 @@ */ package org.mastodon.mamut; +import static org.mastodon.app.MastodonIcons.BDV_VIEW_ICON; import static org.mastodon.app.ui.ViewMenuBuilder.item; import static org.mastodon.app.ui.ViewMenuBuilder.separator; import static org.mastodon.mamut.MamutMenuBuilder.colorMenu; @@ -37,13 +38,9 @@ import static org.mastodon.mamut.MamutMenuBuilder.tagSetMenu; import static org.mastodon.mamut.MamutMenuBuilder.viewMenu; -import java.util.HashMap; -import java.util.Map; - import javax.swing.ActionMap; import javax.swing.JPanel; -import org.jdom2.Element; import org.mastodon.app.ui.MastodonFrameViewActions; import org.mastodon.app.ui.SearchVertexLabel; import org.mastodon.app.ui.ViewMenu; @@ -67,6 +64,8 @@ import org.mastodon.ui.coloring.ColoringModelMain; import org.mastodon.ui.coloring.GraphColorGenerator; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; +import org.mastodon.ui.coloring.HasColorBarOverlay; +import org.mastodon.ui.coloring.HasColoringModel; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.bdv.BdvContextProvider; import org.mastodon.views.bdv.BigDataViewerActionsMamut; @@ -89,36 +88,21 @@ import org.mastodon.views.bdv.overlay.wrap.OverlayGraphWrapper; import org.mastodon.views.bdv.overlay.wrap.OverlayVertexWrapper; import org.mastodon.views.context.ContextProvider; +import org.mastodon.views.context.HasContextProvider; import bdv.BigDataViewerActions; -import bdv.tools.InitializeViewerState; import bdv.util.Affine3DHelpers; import bdv.viewer.NavigationActions; import bdv.viewer.Source; import bdv.viewer.SourceAndConverter; import bdv.viewer.ViewerPanel; -import bdv.viewer.ViewerState; import net.imglib2.realtransform.AffineTransform3D; -public class MamutViewBdv extends MamutView< OverlayGraphWrapper< Spot, Link >, OverlayVertexWrapper< Spot, Link >, - OverlayEdgeWrapper< Spot, Link > > +public class MamutViewBdv + extends MamutView< OverlayGraphWrapper< Spot, Link >, OverlayVertexWrapper< Spot, Link >, OverlayEdgeWrapper< Spot, Link > > + implements HasContextProvider, HasColoringModel, HasColorBarOverlay { - /** - * Key for the {@link ViewerState} in a BDV view. Value is a XML - * {@link Element} serialized from the state. - * - * @see ViewerPanelMamut#stateToXml() - * @see ViewerPanelMamut#stateFromXml(Element) - */ - public static final String BDV_STATE_KEY = "BdvState"; - - /** - * Key for the transform in a BDV view. Value is an - * {@link AffineTransform3D} instance. - */ - public static final String BDV_TRANSFORM_KEY = "BdvTransform"; - // TODO private static int bdvName = 1; @@ -137,11 +121,6 @@ public class MamutViewBdv extends MamutView< OverlayGraphWrapper< Spot, Link >, private final ColorBarOverlay colorBarOverlay; public MamutViewBdv( final ProjectModel appModel ) - { - this( appModel, new HashMap<>() ); - } - - public MamutViewBdv( final ProjectModel appModel, final Map< String, Object > guiState ) { super( appModel, new OverlayGraphWrapper<>( @@ -158,15 +137,8 @@ public MamutViewBdv( final ProjectModel appModel, final Map< String, Object > gu final BigDataViewerMamut bdv = new BigDataViewerMamut( sharedBdvData, windowTitle, groupHandle ); final ViewerFrameMamut frame = bdv.getViewerFrame(); setFrame( frame ); - - // Restore position. - restoreFramePosition( frame, guiState ); - - // Restore group handle. - restoreGroupHandle( groupHandle, guiState ); - - // Restore settings panel visibility. - restoreSettingsPanelVisibility( frame, guiState ); + frame.setIconImages( BDV_VIEW_ICON ); + frame.setIconImages( BDV_VIEW_ICON ); MastodonFrameViewActions.install( viewActions, this ); BigDataViewerActionsMamut.install( viewActions, bdv ); @@ -202,18 +174,6 @@ public MamutViewBdv( final ProjectModel appModel, final Map< String, Object > gu colorBarOverlay = new ColorBarOverlay( coloringModel, () -> viewer.getBackground() ); registerColorbarOverlay( colorBarOverlay, colorbarMenuHandle, () -> viewer.getDisplay().repaint() ); - // Restore BDV state. - final Element stateEl = ( Element ) guiState.get( BDV_STATE_KEY ); - if ( null != stateEl ) - viewer.stateFromXml( stateEl ); - - // Restore transform. - final AffineTransform3D tLoaded = ( AffineTransform3D ) guiState.get( BDV_TRANSFORM_KEY ); - if ( null == tLoaded ) - InitializeViewerState.initTransform( viewer ); - else - viewer.state().setViewerTransform( tLoaded ); - final OverlayGraphRenderer< OverlayVertexWrapper< Spot, Link >, OverlayEdgeWrapper< Spot, Link > > tracksOverlay = createRenderer( viewGraph, @@ -302,12 +262,9 @@ public MamutViewBdv( final ProjectModel appModel, final Map< String, Object > gu // Give focus to display so that it can receive key-presses immediately. viewer.getDisplay().requestFocusInWindow(); - // Notifies context provider that context changes when visibility mode - // changes. + // Notifies context provider that context changes when visibility mode changes. tracksOverlay.getVisibilities().getVisibilityListeners().add( contextProvider::notifyContextChanged ); - frame.setVisible( true ); - MainWindow.addMenus( menu, actionMap ); MamutMenuBuilder.build( menu, actionMap, fileMenu( @@ -334,13 +291,6 @@ public MamutViewBdv( final ProjectModel appModel, final Map< String, Object > gu registerTagSetMenu( tagSetMenuHandle, () -> viewer.getDisplay().repaint() ); - - // Restore coloring. - restoreColoring( coloringModel, guiState ); - - // Restore colorbar state. - restoreColorbarState( colorBarOverlay, guiState ); - viewer.getDisplay().overlays().add( colorBarOverlay ); } protected OverlayGraphRenderer< OverlayVertexWrapper< Spot, Link >, OverlayEdgeWrapper< Spot, Link > > @@ -362,6 +312,7 @@ public MamutViewBdv( final ProjectModel appModel, final Map< String, Object > gu coloring ); } + @Override public ContextProvider< Spot > getContextProvider() { return contextProvider; @@ -377,11 +328,13 @@ void requestRepaint() viewer.requestRepaint(); } + @Override public ColoringModelMain< Spot, Link, BranchSpot, BranchLink > getColoringModel() { return coloringModel; } + @Override public ColorBarOverlay getColorBarOverlay() { return colorBarOverlay; diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index b9d1c9312..9a0872f23 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -57,6 +57,7 @@ import org.mastodon.mamut.feature.MamutFeatureProjectionsManager; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; +import org.mastodon.mamut.views.bdv.MamutViewBdvFactory; import org.mastodon.model.tag.ui.TagSetDialog; import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; @@ -486,8 +487,7 @@ public MamutViewBdv createBigDataViewer() */ public MamutViewBdv createBigDataViewer( final Map< String, Object > guiState ) { - final MamutViewBdv view = new MamutViewBdv( appModel, guiState ); - view.getFrame().setIconImages( BDV_VIEW_ICON ); + final MamutViewBdv view = new MamutViewBdvFactory().show( appModel, guiState ); addBdvWindow( view ); bdvViewCreatedListeners.list.forEach( l -> l.bdvViewCreated( view ) ); return view; diff --git a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java index 1bdff0f14..098834aac 100644 --- a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java +++ b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java @@ -37,8 +37,6 @@ import static org.mastodon.mamut.MamutView.NO_COLORING_KEY; import static org.mastodon.mamut.MamutView.SETTINGS_PANEL_VISIBLE_KEY; import static org.mastodon.mamut.MamutView.TAG_SET_KEY; -import static org.mastodon.mamut.MamutViewBdv.BDV_STATE_KEY; -import static org.mastodon.mamut.MamutViewBdv.BDV_TRANSFORM_KEY; import static org.mastodon.mamut.MamutViewGrapher.GRAPHER_TRANSFORM_KEY; import static org.mastodon.mamut.MamutViewTable.TABLE_DISPLAYED; import static org.mastodon.mamut.MamutViewTable.TABLE_ELEMENT; @@ -86,6 +84,7 @@ import org.mastodon.views.trackscheme.ScreenTransform; import org.mastodon.views.trackscheme.display.TrackSchemePanel; +import bdv.viewer.ViewerState; import mpicbg.spim.data.XmlHelpers; import net.imglib2.realtransform.AffineGet; import net.imglib2.realtransform.AffineTransform3D; @@ -96,6 +95,21 @@ class MamutViewStateSerialization { + /** + * Key for the {@link ViewerState} in a BDV view. Value is a XML + * {@link Element} serialized from the state. + * + * @see ViewerPanelMamut#stateToXml() + * @see ViewerPanelMamut#stateFromXml(Element) + */ + public static final String BDV_STATE_KEY = "BdvState"; + + /** + * Key for the transform in a BDV view. Value is an + * {@link AffineTransform3D} instance. + */ + public static final String BDV_TRANSFORM_KEY = "BdvTransform"; + static final String WINDOW_TAG = "Window"; /** diff --git a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java new file mode 100644 index 000000000..f2f4531af --- /dev/null +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java @@ -0,0 +1,81 @@ +package org.mastodon.mamut.views.bdv; + +import java.util.Map; + +import org.jdom2.Element; +import org.mastodon.mamut.MamutViewBdv; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.views.AbstractMamutViewFactory; +import org.mastodon.mamut.views.MamutViewFactory; +import org.scijava.plugin.Plugin; + +import bdv.tools.InitializeViewerState; +import bdv.viewer.ViewerState; +import net.imglib2.realtransform.AffineTransform3D; + +@Plugin( type = MamutViewFactory.class ) +public class MamutViewBdvFactory extends AbstractMamutViewFactory< MamutViewBdv > +{ + + /** + * Key for the {@link ViewerState} in a BDV view. Value is a XML + * {@link Element} serialized from the state. + * + * @see ViewerPanelMamut#stateToXml() + * @see ViewerPanelMamut#stateFromXml(Element) + */ + public static final String BDV_STATE_KEY = "BdvState"; + + /** + * Key for the transform in a BDV view. Value is an + * {@link AffineTransform3D} instance. + */ + public static final String BDV_TRANSFORM_KEY = "BdvTransform"; + + @Override + public MamutViewBdv create( final ProjectModel projectModel ) + { + return new MamutViewBdv( projectModel ); + } + + @Override + public Map< String, Object > getGuiState( final MamutViewBdv view ) + { + final Map< String, Object > guiState = super.getGuiState( view ); + // Viewer state. + final Element stateEl = view.getViewerPanelMamut().stateToXml(); + guiState.put( BDV_STATE_KEY, stateEl ); + // Transform. + final AffineTransform3D t = new AffineTransform3D(); + view.getViewerPanelMamut().state().getViewerTransform( t ); + guiState.put( BDV_TRANSFORM_KEY, t ); + return guiState; + } + + @Override + public void restoreGuiState( final MamutViewBdv view, final Map< String, Object > guiState ) + { + super.restoreGuiState( view, guiState ); + restoreBDVstate( view, guiState ); + restoreBDVtransform( view, guiState ); + } + + private static void restoreBDVtransform( final MamutViewBdv view, final Map< String, Object > guiState ) + { + // Restore transform. + final AffineTransform3D tLoaded = ( AffineTransform3D ) guiState.get( BDV_TRANSFORM_KEY ); + if ( null == tLoaded ) + InitializeViewerState.initTransform( view.getViewerPanelMamut() ); + else + view.getViewerPanelMamut().state().setViewerTransform( tLoaded ); + } + + private static void restoreBDVstate( final MamutViewBdv view, final Map< String, Object > guiState ) + { + // Restore BDV state. + final Element stateEl = ( Element ) guiState.get( BDV_STATE_KEY ); + if ( null != stateEl ) + view.getViewerPanelMamut().stateFromXml( stateEl ); + } + +} From 4faf38dc22fba8f9a61429f86d272c682d32560a Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 18 Aug 2023 17:41:39 +0200 Subject: [PATCH 029/220] Rework the mother interfaces for Mastodon and Mamut views. - Get rid of IMastodonView and IMastodonFrameView - An interface for views that have a ViewerFrame, that MastodonFrameView implements. - An interface for all Mamut views (branch and core graphs) that extend from it, and add methods for GroupHandle on onClose(). - MamutView and MamutBranchView both implement this interface. --- .../java/org/mastodon/app/IMastodonView.java | 52 ------------------- .../java/org/mastodon/app/MastodonView.java | 3 -- .../java/org/mastodon/app/ui/HasFrame.java | 15 ++++++ .../mastodon/app/ui/IMastodonFrameView.java | 36 ------------- .../mastodon/app/ui/MastodonFrameView.java | 2 +- .../app/ui/MastodonFrameViewActions.java | 6 +-- .../org/mastodon/mamut/MamutBranchView.java | 7 ++- .../java/org/mastodon/mamut/MamutView.java | 4 +- .../mamut/io/MamutViewStateSerialization.java | 7 ++- .../org/mastodon/mamut/views/MamutViewI.java | 17 ++++++ 10 files changed, 45 insertions(+), 104 deletions(-) delete mode 100644 src/main/java/org/mastodon/app/IMastodonView.java create mode 100644 src/main/java/org/mastodon/app/ui/HasFrame.java delete mode 100644 src/main/java/org/mastodon/app/ui/IMastodonFrameView.java create mode 100644 src/main/java/org/mastodon/mamut/views/MamutViewI.java diff --git a/src/main/java/org/mastodon/app/IMastodonView.java b/src/main/java/org/mastodon/app/IMastodonView.java deleted file mode 100644 index 57fb0f7fa..000000000 --- a/src/main/java/org/mastodon/app/IMastodonView.java +++ /dev/null @@ -1,52 +0,0 @@ -/*- - * #%L - * Mastodon - * %% - * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ -package org.mastodon.app; - -import org.mastodon.grouping.GroupHandle; - -public interface IMastodonView -{ - - /** - * Adds the specified {@link Runnable} to the list of runnables to execute - * when this view is closed. - * - * @param runnable - * the {@link Runnable} to add. - */ - void onClose( Runnable runnable ); - - /** - * Exposes the {@link GroupHandle} of this view. - * - * @return the {@link GroupHandle} of this view. - */ - GroupHandle getGroupHandle(); - -} diff --git a/src/main/java/org/mastodon/app/MastodonView.java b/src/main/java/org/mastodon/app/MastodonView.java index c74596cfd..8f92b5c24 100644 --- a/src/main/java/org/mastodon/app/MastodonView.java +++ b/src/main/java/org/mastodon/app/MastodonView.java @@ -74,7 +74,6 @@ public class MastodonView< ME extends AbstractListenableEdge< ME, MV, ?, ? >, V extends Vertex< E >, E extends Edge< V > > - implements IMastodonView { protected final M appModel; @@ -140,7 +139,6 @@ public MastodonView( * @param runnable * the {@link Runnable} to add. */ - @Override public synchronized void onClose( final Runnable runnable ) { runOnClose.add( runnable ); @@ -157,7 +155,6 @@ protected synchronized void close() * * @return the {@link GroupHandle} of this view. */ - @Override public GroupHandle getGroupHandle() { return groupHandle; diff --git a/src/main/java/org/mastodon/app/ui/HasFrame.java b/src/main/java/org/mastodon/app/ui/HasFrame.java new file mode 100644 index 000000000..c87259af3 --- /dev/null +++ b/src/main/java/org/mastodon/app/ui/HasFrame.java @@ -0,0 +1,15 @@ +package org.mastodon.app.ui; + +/** + * Interface for views that have a view frame. + */ +public interface HasFrame +{ + + /** + * Exposes the {@link ViewFrame} in which this view is displayed, + * + * @return the {@link ViewFrame}. + */ + public ViewFrame getFrame(); +} diff --git a/src/main/java/org/mastodon/app/ui/IMastodonFrameView.java b/src/main/java/org/mastodon/app/ui/IMastodonFrameView.java deleted file mode 100644 index 43765ca4a..000000000 --- a/src/main/java/org/mastodon/app/ui/IMastodonFrameView.java +++ /dev/null @@ -1,36 +0,0 @@ -/*- - * #%L - * Mastodon - * %% - * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ -package org.mastodon.app.ui; - -public interface IMastodonFrameView -{ - - ViewFrame getFrame(); - -} diff --git a/src/main/java/org/mastodon/app/ui/MastodonFrameView.java b/src/main/java/org/mastodon/app/ui/MastodonFrameView.java index 3c7757a48..bdde17f84 100644 --- a/src/main/java/org/mastodon/app/ui/MastodonFrameView.java +++ b/src/main/java/org/mastodon/app/ui/MastodonFrameView.java @@ -75,7 +75,7 @@ public class MastodonFrameView< V extends Vertex< E >, E extends Edge< V > > extends MastodonView< M, VG, MV, ME, V, E > - implements IMastodonFrameView + implements HasFrame { protected ViewFrame frame; diff --git a/src/main/java/org/mastodon/app/ui/MastodonFrameViewActions.java b/src/main/java/org/mastodon/app/ui/MastodonFrameViewActions.java index bdc520b38..3775f2501 100644 --- a/src/main/java/org/mastodon/app/ui/MastodonFrameViewActions.java +++ b/src/main/java/org/mastodon/app/ui/MastodonFrameViewActions.java @@ -72,7 +72,7 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) } } - private final IMastodonFrameView view; + private final HasFrame view; private final ToggleSettingsPanelAction toggleSettingsPanelAction; @@ -89,7 +89,7 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) */ public static void install( final Actions actions, - final IMastodonFrameView view ) + final HasFrame view ) { final MastodonFrameViewActions ba = new MastodonFrameViewActions( view ); @@ -97,7 +97,7 @@ public static void install( actions.namedAction( ba.closeWindowAction, CLOSE_WINDOW_KEYS ); } - private MastodonFrameViewActions( final IMastodonFrameView view ) + private MastodonFrameViewActions( final HasFrame view ) { this.view = view; toggleSettingsPanelAction = new ToggleSettingsPanelAction( TOGGLE_SETTINGS_PANEL ); diff --git a/src/main/java/org/mastodon/mamut/MamutBranchView.java b/src/main/java/org/mastodon/mamut/MamutBranchView.java index 3fce91d92..35788f9c3 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchView.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchView.java @@ -43,9 +43,7 @@ import org.mastodon.adapter.RefBimap; import org.mastodon.adapter.SelectionModelAdapter; import org.mastodon.adapter.TimepointModelAdapter; -import org.mastodon.app.IMastodonView; import org.mastodon.app.ViewGraph; -import org.mastodon.app.ui.IMastodonFrameView; import org.mastodon.app.ui.ViewFrame; import org.mastodon.app.ui.ViewMenuBuilder.JMenuHandle; import org.mastodon.feature.FeatureModel; @@ -59,6 +57,7 @@ import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; import org.mastodon.mamut.model.branch.ModelBranchGraph; +import org.mastodon.mamut.views.MamutViewI; import org.mastodon.model.FocusModel; import org.mastodon.model.HighlightModel; import org.mastodon.model.NavigationHandler; @@ -71,6 +70,7 @@ import org.mastodon.model.tag.TagSetModel; import org.mastodon.ui.TagSetMenu; import org.mastodon.ui.coloring.ColorBarOverlay; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.ColoringMenu; import org.mastodon.ui.coloring.ColoringModel; import org.mastodon.ui.coloring.ColoringModelBranchGraph; @@ -78,7 +78,6 @@ import org.mastodon.ui.coloring.GraphColorGenerator; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; import org.mastodon.ui.coloring.TagSetGraphColorGenerator; -import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; import org.mastodon.ui.keymap.Keymap; import org.mastodon.ui.keymap.Keymap.UpdateListener; @@ -91,7 +90,7 @@ public class MamutBranchView< VG extends ViewGraph< BranchSpot, BranchLink, V, E >, V extends Vertex< E >, E extends Edge< V > > - implements IMastodonFrameView, IMastodonView + implements MamutViewI { /** diff --git a/src/main/java/org/mastodon/mamut/MamutView.java b/src/main/java/org/mastodon/mamut/MamutView.java index af38f4542..65de132ca 100644 --- a/src/main/java/org/mastodon/mamut/MamutView.java +++ b/src/main/java/org/mastodon/mamut/MamutView.java @@ -52,22 +52,24 @@ import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; import org.mastodon.mamut.model.branch.ModelBranchGraph; +import org.mastodon.mamut.views.MamutViewI; import org.mastodon.model.SelectionModel; import org.mastodon.model.tag.TagSetModel; import org.mastodon.model.tag.TagSetStructure.TagSet; import org.mastodon.ui.TagSetMenu; import org.mastodon.ui.coloring.ColorBarOverlay; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.ColoringMenu; import org.mastodon.ui.coloring.ColoringModel; import org.mastodon.ui.coloring.ColoringModelMain; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; import org.mastodon.ui.coloring.TagSetGraphColorGenerator; -import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.feature.FeatureColorMode; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; public class MamutView< VG extends ViewGraph< Spot, Link, V, E >, V extends Vertex< E >, E extends Edge< V > > extends MastodonFrameView< ProjectModel, VG, Spot, Link, V, E > + implements MamutViewI { /** diff --git a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java index 098834aac..149ee4055 100644 --- a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java +++ b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java @@ -59,8 +59,6 @@ import javax.swing.JViewport; import org.jdom2.Element; -import org.mastodon.app.IMastodonView; -import org.mastodon.app.ui.IMastodonFrameView; import org.mastodon.mamut.MamutBranchViewBdv; import org.mastodon.mamut.MamutBranchViewTrackScheme; import org.mastodon.mamut.MamutView; @@ -73,6 +71,7 @@ import org.mastodon.mamut.model.Spot; import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; +import org.mastodon.mamut.views.MamutViewI; import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.ColoringModel; @@ -130,7 +129,7 @@ class MamutViewStateSerialization * the GUI state to serialize. * @return a new XML element. */ - static < V extends IMastodonFrameView & IMastodonView > Element toXml( final V view ) + static < V extends MamutViewI > Element toXml( final V view ) { final Map< String, Object > guiState = getGuiState( view ); final Element element = new Element( WINDOW_TAG ); @@ -233,7 +232,7 @@ else if ( value instanceof List ) * the view. * @return a new {@link Map}. */ - private static < V extends IMastodonFrameView & IMastodonView > Map< String, Object > getGuiState( final V view ) + private static < V extends MamutViewI > Map< String, Object > getGuiState( final V view ) { final Map< String, Object > guiState = new LinkedHashMap<>(); diff --git a/src/main/java/org/mastodon/mamut/views/MamutViewI.java b/src/main/java/org/mastodon/mamut/views/MamutViewI.java new file mode 100644 index 000000000..5a8b16021 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/views/MamutViewI.java @@ -0,0 +1,17 @@ +package org.mastodon.mamut.views; + +import org.mastodon.app.ui.HasFrame; +import org.mastodon.grouping.GroupHandle; + +/** + * Interface for the views specific to the Mamut application. They have at least + * a frame, a group handle and a onClose() method. + */ +public interface MamutViewI extends HasFrame +{ + + public void onClose( final Runnable runnable ); + + public GroupHandle getGroupHandle(); + +} From 7537f369c8301bda17ee8b7e714290280f289405 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 18 Aug 2023 17:42:59 +0200 Subject: [PATCH 030/220] The mamut view factory uses MamutViewI. So that now we can have one factory type for both branch and core graph views. Tune the bdv factory accordingly. --- .../mamut/views/AbstractMamutViewFactory.java | 11 +++--- .../mamut/views/MamutViewFactory.java | 3 +- .../mamut/views/bdv/MamutViewBdvFactory.java | 36 +++++++++---------- 3 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java b/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java index a21f9d49c..f9a2000f1 100644 --- a/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java +++ b/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java @@ -18,7 +18,6 @@ import org.mastodon.app.ui.ViewFrame; import org.mastodon.grouping.GroupHandle; -import org.mastodon.mamut.MamutView; import org.mastodon.mamut.ProjectModel; import org.mastodon.model.tag.TagSetStructure.TagSet; import org.mastodon.ui.coloring.ColorBarOverlay; @@ -28,7 +27,7 @@ import org.mastodon.ui.coloring.HasColoringModel; import org.mastodon.ui.coloring.feature.FeatureColorMode; -public abstract class AbstractMamutViewFactory< T extends MamutView< ?, ?, ? > > implements MamutViewFactory< T > +public abstract class AbstractMamutViewFactory< T extends MamutViewI > implements MamutViewFactory< T > { @Override @@ -90,7 +89,7 @@ public Map< String, Object > getGuiState( final T view ) * @param guiState * the map to store it to. */ - private static void getColoringState( final MamutView< ?, ?, ? > view, final Map< String, Object > guiState ) + private static void getColoringState( final MamutViewI view, final Map< String, Object > guiState ) { if ( !( view instanceof HasColoringModel ) ) return; @@ -105,7 +104,7 @@ else if ( coloringModel.getFeatureColorMode() != null ) guiState.put( FEATURE_COLOR_MODE_KEY, coloringModel.getFeatureColorMode().getName() ); } - private static void getColorBarOverlayState( final MamutView< ?, ?, ? > view, final Map< String, Object > guiState ) + private static void getColorBarOverlayState( final MamutViewI view, final Map< String, Object > guiState ) { if ( !( view instanceof HasColorBarOverlay ) ) return; @@ -119,7 +118,7 @@ private static void getColorBarOverlayState( final MamutView< ?, ?, ? > view, fi * Restore GUI state utilities. */ - private static void restoreColoringModel( final MamutView< ?, ?, ? > viewraw, final Map< String, Object > guiState ) + private static void restoreColoringModel( final MamutViewI viewraw, final Map< String, Object > guiState ) { if ( guiState == null || ( !( viewraw instanceof HasColoringModel ) ) ) return; @@ -163,7 +162,7 @@ else if ( null != featureColorModeName ) } } - private static void restoreColorbarState( final MamutView< ?, ?, ? > view, final Map< String, Object > guiState ) + private static void restoreColorbarState( final MamutViewI view, final Map< String, Object > guiState ) { if ( !( view instanceof HasColorBarOverlay ) ) return; diff --git a/src/main/java/org/mastodon/mamut/views/MamutViewFactory.java b/src/main/java/org/mastodon/mamut/views/MamutViewFactory.java index 0b1d99aeb..3dd435242 100644 --- a/src/main/java/org/mastodon/mamut/views/MamutViewFactory.java +++ b/src/main/java/org/mastodon/mamut/views/MamutViewFactory.java @@ -2,11 +2,10 @@ import java.util.Map; -import org.mastodon.mamut.MamutView; import org.mastodon.mamut.ProjectModel; import org.scijava.plugin.SciJavaPlugin; -public interface MamutViewFactory< T extends MamutView< ?, ?, ? > > extends SciJavaPlugin +public interface MamutViewFactory< T extends MamutViewI > extends SciJavaPlugin { /** diff --git a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java index f2f4531af..78a3802cc 100644 --- a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java @@ -10,6 +10,7 @@ import org.scijava.plugin.Plugin; import bdv.tools.InitializeViewerState; +import bdv.viewer.ViewerPanel; import bdv.viewer.ViewerState; import net.imglib2.realtransform.AffineTransform3D; @@ -42,13 +43,7 @@ public MamutViewBdv create( final ProjectModel projectModel ) public Map< String, Object > getGuiState( final MamutViewBdv view ) { final Map< String, Object > guiState = super.getGuiState( view ); - // Viewer state. - final Element stateEl = view.getViewerPanelMamut().stateToXml(); - guiState.put( BDV_STATE_KEY, stateEl ); - // Transform. - final AffineTransform3D t = new AffineTransform3D(); - view.getViewerPanelMamut().state().getViewerTransform( t ); - guiState.put( BDV_TRANSFORM_KEY, t ); + getBdvGuiState( view.getViewerPanelMamut(), guiState ); return guiState; } @@ -56,26 +51,31 @@ public Map< String, Object > getGuiState( final MamutViewBdv view ) public void restoreGuiState( final MamutViewBdv view, final Map< String, Object > guiState ) { super.restoreGuiState( view, guiState ); - restoreBDVstate( view, guiState ); - restoreBDVtransform( view, guiState ); + restoreBdvGuiState( view.getViewerPanelMamut(), guiState ); } - private static void restoreBDVtransform( final MamutViewBdv view, final Map< String, Object > guiState ) + static void getBdvGuiState( final ViewerPanel viewerPanel, final Map< String, Object > guiState ) + { + // Viewer state. + final Element stateEl = viewerPanel.stateToXml(); + guiState.put( BDV_STATE_KEY, stateEl ); + // Transform. + final AffineTransform3D t = new AffineTransform3D(); + viewerPanel.state().getViewerTransform( t ); + guiState.put( BDV_TRANSFORM_KEY, t ); + } + + static void restoreBdvGuiState( final ViewerPanel viewerPanel, final Map< String, Object > guiState ) { // Restore transform. final AffineTransform3D tLoaded = ( AffineTransform3D ) guiState.get( BDV_TRANSFORM_KEY ); if ( null == tLoaded ) - InitializeViewerState.initTransform( view.getViewerPanelMamut() ); + InitializeViewerState.initTransform( viewerPanel ); else - view.getViewerPanelMamut().state().setViewerTransform( tLoaded ); - } - - private static void restoreBDVstate( final MamutViewBdv view, final Map< String, Object > guiState ) - { + viewerPanel.state().setViewerTransform( tLoaded ); // Restore BDV state. final Element stateEl = ( Element ) guiState.get( BDV_STATE_KEY ); if ( null != stateEl ) - view.getViewerPanelMamut().stateFromXml( stateEl ); + viewerPanel.stateFromXml( stateEl ); } - } From e3a1738fc5fafed22495b8f27f08d216ca7c0588 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 18 Aug 2023 17:43:27 +0200 Subject: [PATCH 031/220] A factory for branch bdv views. --- .../mastodon/mamut/MamutBranchViewBdv.java | 45 +------------------ .../org/mastodon/mamut/WindowManager.java | 5 +-- .../views/bdv/MamutBranchViewBdvFactory.java | 35 +++++++++++++++ 3 files changed, 39 insertions(+), 46 deletions(-) create mode 100644 src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdvFactory.java diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java index e4d4dee7e..a4127b1f1 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java @@ -28,6 +28,7 @@ */ package org.mastodon.mamut; +import static org.mastodon.app.MastodonIcons.BDV_VIEW_ICON; import static org.mastodon.app.ui.ViewMenuBuilder.item; import static org.mastodon.app.ui.ViewMenuBuilder.separator; import static org.mastodon.mamut.MamutMenuBuilder.branchColorMenu; @@ -36,16 +37,10 @@ import static org.mastodon.mamut.MamutMenuBuilder.fileMenu; import static org.mastodon.mamut.MamutMenuBuilder.tagSetMenu; import static org.mastodon.mamut.MamutMenuBuilder.viewMenu; -import static org.mastodon.mamut.views.bdv.MamutViewBdvFactory.BDV_STATE_KEY; -import static org.mastodon.mamut.views.bdv.MamutViewBdvFactory.BDV_TRANSFORM_KEY; - -import java.util.HashMap; -import java.util.Map; import javax.swing.ActionMap; import javax.swing.JPanel; -import org.jdom2.Element; import org.mastodon.app.ui.MastodonFrameViewActions; import org.mastodon.app.ui.SearchVertexLabel; import org.mastodon.app.ui.ViewMenu; @@ -87,10 +82,8 @@ import org.mastodon.views.bdv.overlay.wrap.OverlayVertexWrapper; import bdv.BigDataViewerActions; -import bdv.tools.InitializeViewerState; import bdv.viewer.NavigationActions; import bdv.viewer.ViewerPanel; -import net.imglib2.realtransform.AffineTransform3D; public class MamutBranchViewBdv extends MamutBranchView< OverlayGraphWrapper< BranchSpot, BranchLink >, @@ -107,11 +100,6 @@ public class MamutBranchViewBdv extends MamutBranchView< private final ColorBarOverlay colorBarOverlay; public MamutBranchViewBdv( final ProjectModel appModel ) - { - this( appModel, new HashMap<>() ); - } - - public MamutBranchViewBdv( final ProjectModel appModel, final Map< String, Object > guiState ) { super( appModel, createViewBranchGraph( appModel ), new String[] { KeyConfigContexts.BIGDATAVIEWER } ); @@ -123,17 +111,9 @@ public MamutBranchViewBdv( final ProjectModel appModel, final Map< String, Objec final BigDataViewerMamut bdv = new BigDataViewerMamut( sharedBdvData, windowTitle, groupHandle ); final ViewerFrameMamut viewerFrame = bdv.getViewerFrame(); setFrame( viewerFrame ); + frame.setIconImages( BDV_VIEW_ICON ); viewer = bdv.getViewer(); - // Restore position. - MamutView.restoreFramePosition( viewerFrame, guiState ); - - // Restore group handle. - MamutView.restoreGroupHandle( groupHandle, guiState ); - - // Restore settings panel visibility. - MamutView.restoreSettingsPanelVisibility( viewerFrame, guiState ); - // Menus final ViewMenu menu = new ViewMenu( frame.getJMenuBar(), appModel.getKeymap(), keyConfigContexts ); final ActionMap actionMap = frame.getKeybindings().getConcatenatedActionMap(); @@ -175,25 +155,6 @@ public MamutBranchViewBdv( final ProjectModel appModel, final Map< String, Objec registerTagSetMenu( tagSetMenuHandle, () -> viewer.getDisplay().repaint() ); - // Restore coloring. - MamutView.restoreColoring( coloringModel, guiState ); - - // Restore colorbar state. - MamutView.restoreColorbarState( colorBarOverlay, guiState ); - viewer.getDisplay().overlays().add( colorBarOverlay ); - - // Restore BDV state. - final Element stateEl = ( Element ) guiState.get( BDV_STATE_KEY ); - if ( null != stateEl ) - viewer.stateFromXml( stateEl ); - - // Restore transform. - final AffineTransform3D tLoaded = ( AffineTransform3D ) guiState.get( BDV_TRANSFORM_KEY ); - if ( null == tLoaded ) - InitializeViewerState.initTransform( viewer ); - else - viewer.state().setViewerTransform( tLoaded ); - // Renderer. final OverlayGraphRenderer< OverlayVertexWrapper< BranchSpot, BranchLink >, OverlayEdgeWrapper< BranchSpot, BranchLink > > tracksOverlay = @@ -274,8 +235,6 @@ public MamutBranchViewBdv( final ProjectModel appModel, final Map< String, Objec // Give focus to display so that it can receive key-presses immediately. viewer.getDisplay().requestFocusInWindow(); - - viewerFrame.setVisible( true ); } public ColoringModel getColoringModel() diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 9a0872f23..c68810dc1 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -28,7 +28,6 @@ */ package org.mastodon.mamut; -import static org.mastodon.app.MastodonIcons.BDV_VIEW_ICON; import static org.mastodon.app.MastodonIcons.FEATURES_ICON; import static org.mastodon.app.MastodonIcons.TABLE_VIEW_ICON; import static org.mastodon.app.MastodonIcons.TAGS_ICON; @@ -57,6 +56,7 @@ import org.mastodon.mamut.feature.MamutFeatureProjectionsManager; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; +import org.mastodon.mamut.views.bdv.MamutBranchViewBdvFactory; import org.mastodon.mamut.views.bdv.MamutViewBdvFactory; import org.mastodon.model.tag.ui.TagSetDialog; import org.mastodon.ui.coloring.ColorBarOverlay.Position; @@ -677,8 +677,7 @@ public MamutBranchViewBdv createBranchBigDataViewer() */ public MamutBranchViewBdv createBranchBigDataViewer( final Map< String, Object > guiState ) { - final MamutBranchViewBdv view = new MamutBranchViewBdv( appModel, guiState ); - view.getFrame().setIconImages( BDV_VIEW_ICON ); + final MamutBranchViewBdv view = new MamutBranchViewBdvFactory().show( appModel, guiState ); addBBdvWindow( view ); return view; } diff --git a/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdvFactory.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdvFactory.java new file mode 100644 index 000000000..ee72cf7ba --- /dev/null +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdvFactory.java @@ -0,0 +1,35 @@ +package org.mastodon.mamut.views.bdv; + +import java.util.Map; + +import org.mastodon.mamut.MamutBranchViewBdv; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.views.AbstractMamutViewFactory; +import org.mastodon.mamut.views.MamutViewFactory; +import org.scijava.plugin.Plugin; + +@Plugin( type = MamutViewFactory.class ) +public class MamutBranchViewBdvFactory extends AbstractMamutViewFactory< MamutBranchViewBdv > +{ + + @Override + public MamutBranchViewBdv create( final ProjectModel projectModel ) + { + return new MamutBranchViewBdv( projectModel ); + } + + @Override + public Map< String, Object > getGuiState( final MamutBranchViewBdv view ) + { + final Map< String, Object > guiState = super.getGuiState( view ); + MamutViewBdvFactory.getBdvGuiState( view.getViewerPanelMamut(), guiState ); + return guiState; + } + + @Override + public void restoreGuiState( final MamutBranchViewBdv view, final Map< String, Object > guiState ) + { + super.restoreGuiState( view, guiState ); + MamutViewBdvFactory.restoreBdvGuiState( view.getViewerPanelMamut(), guiState ); + } +} From 88fc3c211200103dedc5779061b1afcd9ff8fb2d Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 18 Aug 2023 17:53:19 +0200 Subject: [PATCH 032/220] Use the common MamutViewI interface in WindowManager. Now we manage all views (branch and core graphs) within one field with one set of methods. --- .../org/mastodon/mamut/WindowManager.java | 82 ++++--------------- .../org/mastodon/mamut/io/ProjectSaver.java | 1 - 2 files changed, 14 insertions(+), 69 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index c68810dc1..7f6fd074d 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -56,6 +56,7 @@ import org.mastodon.mamut.feature.MamutFeatureProjectionsManager; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; +import org.mastodon.mamut.views.MamutViewI; import org.mastodon.mamut.views.bdv.MamutBranchViewBdvFactory; import org.mastodon.mamut.views.bdv.MamutViewBdvFactory; import org.mastodon.model.tag.ui.TagSetDialog; @@ -145,10 +146,7 @@ public class WindowManager private final Map< Class< ? >, Object > managers = new HashMap<>(); /** Stores the different lists of mamut views currently opened. */ - private final Map< Class< ? extends MamutView< ?, ?, ? > >, List< MamutView< ?, ?, ? > > > mamutViews = new HashMap<>(); - - /** Stores the different lists of mamut branch views currently opened. */ - private final Map< Class< ? extends MamutBranchView< ?, ?, ? > >, List< MamutBranchView< ?, ?, ? > > > mamutBranchViews = new HashMap<>(); + private final Map< Class< ? extends MamutViewI >, List< MamutViewI > > mamutViews = new HashMap<>(); private final TagSetDialog tagSetDialog; @@ -182,19 +180,13 @@ public WindowManager( final ProjectModel appModel ) MamutViewBdv.class, MamutViewTrackScheme.class, MamutViewTable.class, - MamutViewGrapher.class + MamutViewGrapher.class, + MamutBranchViewBdv.class, + MamutBranchViewTrackScheme.class }; for ( final Class< MamutView< ?, ?, ? > > klass : knownMamutViewTypes ) mamutViews.put( klass, new ArrayList<>() ); - @SuppressWarnings( "unchecked" ) - final Class< MamutBranchView< ?, ?, ? > >[] knownMamutBranchViewTypes = new Class[] { - MamutBranchViewBdv.class, - MamutBranchViewTrackScheme.class, - }; - for ( final Class< MamutBranchView< ?, ?, ? > > klass : knownMamutBranchViewTypes ) - mamutBranchViews.put( klass, new ArrayList<>() ); - /* * Create and store managers. */ @@ -289,35 +281,18 @@ public < T > T getManager( final Class< T > klass ) * null if a view of this type is not registered. * * @param - * the view type, must extend {@link MamutView}. + * the view type, must extend {@link MamutViewI}. * @param klass - * the view class, must extend {@link MamutView}. + * the view class, must extend {@link MamutViewI}. * @return the list of view of specified class, or null. */ - private < T extends MamutView< ?, ?, ? > > List< T > getViewList( final Class< T > klass ) + private < T extends MamutViewI > List< T > getViewList( final Class< T > klass ) { @SuppressWarnings( "unchecked" ) final List< T > list = ( List< T > ) mamutViews.get( klass ); return list; } - /** - * Returns the list of opened mamut branch views of the specified type, or - * null if a view of this type is not registered. - * - * @param - * the view type, must extend {@link MamutBranchView}. - * @param klass - * the view class, must extend {@link MamutBranchView}. - * @return the list of view of specified class, or null. - */ - private < T extends MamutBranchView< ?, ?, ? > > List< T > getBranchViewList( final Class< T > klass ) - { - @SuppressWarnings( "unchecked" ) - final List< T > list = ( List< T > ) mamutBranchViews.get( klass ); - return list; - } - private synchronized void addBdvWindow( final MamutViewBdv w ) { getViewList( MamutViewBdv.class ).add( w ); @@ -347,8 +322,8 @@ private synchronized void addBdvWindow( final MamutViewBdv w ) private synchronized void addBBdvWindow( final MamutBranchViewBdv w ) { - getBranchViewList( MamutBranchViewBdv.class ).add( w ); - w.onClose( () -> getBranchViewList( MamutBranchViewBdv.class ).remove( w ) ); + getViewList( MamutBranchViewBdv.class ).add( w ); + w.onClose( () -> getViewList( MamutBranchViewBdv.class ).remove( w ) ); } private synchronized void addTsWindow( final MamutViewTrackScheme w ) @@ -363,8 +338,8 @@ private synchronized void addTsWindow( final MamutViewTrackScheme w ) private synchronized void addBTsWindow( final MamutBranchViewTrackScheme w ) { - getBranchViewList( MamutBranchViewTrackScheme.class ).add( w ); - w.onClose( () -> getBranchViewList( MamutBranchViewTrackScheme.class ).remove( w ) ); + getViewList( MamutBranchViewTrackScheme.class ).add( w ); + w.onClose( () -> getViewList( MamutBranchViewTrackScheme.class ).remove( w ) ); } private synchronized void addTableWindow( final MamutViewTable table ) @@ -396,52 +371,24 @@ private synchronized void addGrapherWindow( final MamutViewGrapher grapher ) * @param klass * the view class. */ - public < T extends MamutView< ?, ?, ? > > void forEachView( final Class< T > klass, final Consumer< T > action ) + public < T extends MamutViewI > void forEachView( final Class< T > klass, final Consumer< T > action ) { Optional.of( getViewList( klass ) ) .orElse( Collections.emptyList() ) .forEach( action ); } - /** - * Executes the specified action for all the currently opened branch views - * of the specified class. - * - * @param action - * the action to execute. - * @param klass - * the view class. - */ - public < T extends MamutBranchView< ?, ?, ? > > void forEachBranchView( final Class< T > klass, final Consumer< T > action ) - { - Optional.of( getBranchViewList( klass ) ) - .orElse( Collections.emptyList() ) - .forEach( action ); - } - /** * Executes the specified action for all the currently opened mamut views. * * @param action * the action to execute. */ - public void forEachView( final Consumer< ? super MamutView< ?, ?, ? > > action ) + public void forEachView( final Consumer< ? super MamutViewI > action ) { mamutViews.forEach( ( k, l ) -> l.forEach( action ) ); } - /** - * Executes the specified action for all the currently opened mamut branch - * views. - * - * @param action - * the action to execute. - */ - public void forEachBranchView( final Consumer< ? super MamutBranchView< ?, ?, ? > > action ) - { - mamutBranchViews.forEach( ( k, l ) -> l.forEach( action ) ); - } - /** * Creates and displays a new BDV view, with default display settings. */ @@ -773,7 +720,6 @@ public void closeAllWindows() { final ArrayList< Window > windows = new ArrayList<>(); forEachView( v -> windows.add( v.getFrame() ) ); - forEachBranchView( v -> windows.add( v.getFrame() ) ); windows.add( tagSetDialog ); windows.add( featureComputationDialog ); diff --git a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java index 3de74b7a8..19e71d4a7 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java @@ -251,7 +251,6 @@ private static void saveGUI( final ProjectWriter writer, final WindowManager win guiRoot.setAttribute( MAMUTPROJECT_VERSION_ATTRIBUTE_NAME, MAMUTPROJECT_VERSION_ATTRIBUTE_CURRENT ); final Element windows = new Element( WINDOWS_TAG ); windowManager.forEachView( ( view ) -> windows.addContent( MamutViewStateSerialization.toXml( view ) ) ); - windowManager.forEachBranchView( ( view ) -> windows.addContent( MamutViewStateSerialization.toXml( view ) ) ); guiRoot.addContent( windows ); final Document doc = new Document( guiRoot ); final XMLOutputter xout = new XMLOutputter( Format.getPrettyFormat() ); From 22aedf1d2d143e278ee18714de982e5280f41ea5 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 18 Aug 2023 18:13:18 +0200 Subject: [PATCH 033/220] Let MamutBranchViewBdv implements HasColorBarOverlay & HasColoringModel. --- src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java index a4127b1f1..09d716cfb 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java @@ -62,6 +62,8 @@ import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColoringModel; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; +import org.mastodon.ui.coloring.HasColorBarOverlay; +import org.mastodon.ui.coloring.HasColoringModel; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.bdv.BigDataViewerActionsMamut; import org.mastodon.views.bdv.BigDataViewerMamut; @@ -89,6 +91,7 @@ public class MamutBranchViewBdv extends MamutBranchView< OverlayGraphWrapper< BranchSpot, BranchLink >, OverlayVertexWrapper< BranchSpot, BranchLink >, OverlayEdgeWrapper< BranchSpot, BranchLink > > + implements HasColorBarOverlay, HasColoringModel { private static int bdvName = 1; @@ -237,11 +240,13 @@ public MamutBranchViewBdv( final ProjectModel appModel ) viewer.getDisplay().requestFocusInWindow(); } + @Override public ColoringModel getColoringModel() { return coloringModel; } + @Override public ColorBarOverlay getColorBarOverlay() { return colorBarOverlay; From ea722f63a227e8d6a34088a1b6e782834e93b0bd Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 18 Aug 2023 19:00:57 +0200 Subject: [PATCH 034/220] Factory pattern for trackscheme views. --- .../mamut/MamutBranchViewTrackScheme.java | 54 ++---------- .../MamutBranchViewTrackSchemeHierarchy.java | 15 +--- .../mastodon/mamut/MamutViewTrackScheme.java | 82 ++++--------------- .../org/mastodon/mamut/WindowManager.java | 14 ++-- .../mamut/io/MamutViewStateSerialization.java | 4 +- .../MamutBranchViewTrackSchemeFactory.java | 32 ++++++++ ...BranchViewTrackSchemeHierarchyFactory.java | 32 ++++++++ .../MamutViewTrackSchemeFactory.java | 55 +++++++++++++ .../trackscheme/display/TrackSchemeFrame.java | 3 + 9 files changed, 154 insertions(+), 137 deletions(-) create mode 100644 src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeFactory.java create mode 100644 src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchyFactory.java create mode 100644 src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackSchemeFactory.java diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java index d3ded9f08..6dd740a24 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java @@ -35,11 +35,7 @@ import static org.mastodon.mamut.MamutMenuBuilder.editMenu; import static org.mastodon.mamut.MamutMenuBuilder.tagSetMenu; import static org.mastodon.mamut.MamutMenuBuilder.viewMenu; -import static org.mastodon.mamut.MamutView.FRAME_POSITION_KEY; -import static org.mastodon.mamut.MamutViewTrackScheme.TRACKSCHEME_TRANSFORM_KEY; -import java.util.HashMap; -import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock; import javax.swing.ActionMap; @@ -69,10 +65,11 @@ import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColoringModel; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; +import org.mastodon.ui.coloring.HasColorBarOverlay; +import org.mastodon.ui.coloring.HasColoringModel; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.trackscheme.LineageTreeLayout; import org.mastodon.views.trackscheme.LongEdgesLineageTreeLayout; -import org.mastodon.views.trackscheme.ScreenTransform; import org.mastodon.views.trackscheme.TrackSchemeEdge; import org.mastodon.views.trackscheme.TrackSchemeGraph; import org.mastodon.views.trackscheme.TrackSchemeVertex; @@ -94,6 +91,7 @@ public class MamutBranchViewTrackScheme extends MamutBranchView< TrackSchemeGraph< BranchSpot, BranchLink >, TrackSchemeVertex, TrackSchemeEdge > + implements HasColoringModel, HasColorBarOverlay { protected final FadingModelAdapter< BranchSpot, BranchLink, TrackSchemeVertex, TrackSchemeEdge > fadingModelAdapter; @@ -104,18 +102,12 @@ public class MamutBranchViewTrackScheme public MamutBranchViewTrackScheme( final ProjectModel appModel ) { - this( appModel, new HashMap<>() ); - } - - public MamutBranchViewTrackScheme( final ProjectModel appModel, final Map< String, Object > guiState ) - { - this( appModel, guiState, new BranchTimeTrackSchemeFactory(), new BranchTrackSchemeOverlayFactory(), + this( appModel, new BranchTimeTrackSchemeFactory(), new BranchTrackSchemeOverlayFactory(), LongEdgesLineageTreeLayout::new, null ); } protected MamutBranchViewTrackScheme( final ProjectModel appModel, - final Map< String, Object > guiState, final BranchTrackSchemeFactory trackSchemeGraphFactory, final TrackSchemeOverlayFactory overlayFactory, final LineageTreeLayout.LineageTreeLayoutFactory lineageTreeLayoutFactory, @@ -138,18 +130,6 @@ protected MamutBranchViewTrackScheme( this.fadingModelAdapter = new FadingModelAdapter<>( null, vertexMap, edgeMap ); this.runOnClose.add( fadingModelAdapter::removeAllListeners ); - // Restore position - final int[] pos = ( int[] ) guiState.get( FRAME_POSITION_KEY ); - if ( null != pos && pos.length == 4 ) - options - .x( pos[ 0 ] ) - .y( pos[ 1 ] ) - .width( pos[ 2 ] ) - .height( pos[ 3 ] ); - - // Restore group handle. - MamutView.restoreGroupHandle( groupHandle, guiState ); - // Show TrackSchemeFrame. final Model model = appModel.getModel(); final AutoNavigateFocusModel< TrackSchemeVertex, TrackSchemeEdge > navigateFocusModel = @@ -172,21 +152,9 @@ protected MamutBranchViewTrackScheme( frame.setTitle( "TrackScheme Branch" ); setFrame( frame ); - // Restore settings panel visibility. - MamutView.restoreSettingsPanelVisibility( frame, guiState ); - - // Default location. - if ( null == pos || pos.length != 4 ) - frame.setLocationRelativeTo( null ); - final TrackSchemeStyle.UpdateListener updateListener = () -> frame.getTrackschemePanel().repaint(); forwardDefaultStyle.updateListeners().add( updateListener ); - // Transform. - final ScreenTransform tLoaded = ( ScreenTransform ) guiState.get( TRACKSCHEME_TRANSFORM_KEY ); - if ( null != tLoaded ) - frame.getTrackschemePanel().getScreenTransform().set( tLoaded ); - // Timepoint and number of spots. final TimepointAndNumberOfSpotsPanel timepointAndNumberOfSpotsPanel = new TimepointAndNumberOfSpotsPanel( this.timepointModel, model ); @@ -289,18 +257,10 @@ protected MamutBranchViewTrackScheme( model.getGraph().addVertexLabelListener( v -> SwingUtilities.invokeLater( () -> frame.getTrackschemePanel().entitiesAttributesChanged() ) ); - // Restore colorbar state. - MamutView.restoreColorbarState( colorBarOverlay, guiState ); - frame.getTrackschemePanel().getDisplay().overlays().add( colorBarOverlay ); - - // Restore coloring. - MamutView.restoreColoring( coloringModel, guiState ); - // Time range and display refresh. frame.getTrackschemePanel().setTimepointRange( appModel.getMinTimepoint(), appModel.getMaxTimepoint() ); frame.getTrackschemePanel().graphChanged(); - frame.setVisible( true ); frame.getTrackschemePanel().repaint(); /* @@ -317,9 +277,7 @@ protected MamutBranchViewTrackScheme( { new Thread( () -> { appModel.getBranchGraphSync().sync(); - // Reset zoom only if we did not receive a transform. - if ( null == tLoaded ) - frame.getTrackschemePanel().getTransformEventHandler().zoomOutFully(); + frame.getTrackschemePanel().getTransformEventHandler().zoomOutFully(); } ).start(); } } @@ -390,11 +348,13 @@ public int getFirstTimePoint( final BranchSpot branchSpot ) } + @Override public ColoringModel getColoringModel() { return coloringModel; } + @Override public ColorBarOverlay getColorBarOverlay() { return colorBarOverlay; diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackSchemeHierarchy.java b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackSchemeHierarchy.java index 41e7a6cf6..0f8d40ec5 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackSchemeHierarchy.java +++ b/src/main/java/org/mastodon/mamut/MamutBranchViewTrackSchemeHierarchy.java @@ -28,10 +28,6 @@ */ package org.mastodon.mamut; -import java.util.HashMap; -import java.util.Map; - - import org.mastodon.graph.GraphChangeListener; import org.mastodon.graph.GraphIdBimap; import org.mastodon.graph.algorithm.traversal.InverseDepthFirstIterator; @@ -63,12 +59,7 @@ public class MamutBranchViewTrackSchemeHierarchy extends MamutBranchViewTrackSch public MamutBranchViewTrackSchemeHierarchy( final ProjectModel appModel ) { - this( appModel, new HashMap<>() ); - } - - public MamutBranchViewTrackSchemeHierarchy( final ProjectModel appModel, final Map< String, Object > guiState ) - { - super( appModel, guiState, new BranchHierarchyTrackSchemeFactory(), new HierarchyTrackSchemeOverlayFactory(), + super( appModel, new BranchHierarchyTrackSchemeFactory(), new HierarchyTrackSchemeOverlayFactory(), LineageTreeLayoutImp::new, new DefaultTimepointModel() ); // Window title. @@ -146,7 +137,7 @@ public int getTimepoint( final BranchSpot v ) } @Override - public String getFirstLabel( BranchSpot branchSpot ) + public String getFirstLabel( final BranchSpot branchSpot ) { return branchSpot.getFirstLabel(); } @@ -166,6 +157,4 @@ public TrackSchemeOverlay create( new PaintHierarchicalGraph(), options ); } } - - } diff --git a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java index 59222abc5..81bb52045 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java @@ -37,8 +37,6 @@ import static org.mastodon.mamut.MamutMenuBuilder.viewMenu; import java.awt.Component; -import java.util.HashMap; -import java.util.Map; import javax.swing.ActionMap; import javax.swing.JPanel; @@ -65,10 +63,11 @@ import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColoringModelMain; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; +import org.mastodon.ui.coloring.HasColorBarOverlay; +import org.mastodon.ui.coloring.HasColoringModel; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.context.ContextChooser; import org.mastodon.views.context.HasContextChooser; -import org.mastodon.views.trackscheme.ScreenTransform; import org.mastodon.views.trackscheme.TrackSchemeContextListener; import org.mastodon.views.trackscheme.TrackSchemeEdge; import org.mastodon.views.trackscheme.TrackSchemeGraph; @@ -79,7 +78,6 @@ import org.mastodon.views.trackscheme.display.TrackSchemeFrame; import org.mastodon.views.trackscheme.display.TrackSchemeNavigationActions; import org.mastodon.views.trackscheme.display.TrackSchemeOptions; -import org.mastodon.views.trackscheme.display.TrackSchemePanel; import org.mastodon.views.trackscheme.display.TrackSchemeZoom; import org.mastodon.views.trackscheme.display.style.TrackSchemeStyle; import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleManager; @@ -87,15 +85,9 @@ public class MamutViewTrackScheme extends MamutView< TrackSchemeGraph< Spot, Link >, TrackSchemeVertex, TrackSchemeEdge > - implements HasContextChooser< Spot > + implements HasContextChooser< Spot >, HasColorBarOverlay, HasColoringModel { - /** - * Key for the transform in a TrackScheme view. Value is a - * {@link ScreenTransform} instance. - */ - public static final String TRACKSCHEME_TRANSFORM_KEY = "TrackSchemeTransform"; - private final ContextChooser< Spot > contextChooser; /** @@ -113,11 +105,6 @@ public class MamutViewTrackScheme private final ColorBarOverlay colorBarOverlay; public MamutViewTrackScheme( final ProjectModel appModel ) - { - this( appModel, new HashMap<>() ); - } - - public MamutViewTrackScheme( final ProjectModel appModel, final Map< String, Object > guiState ) { super( appModel, new TrackSchemeGraph<>( @@ -147,18 +134,6 @@ public MamutViewTrackScheme( final ProjectModel appModel, final Map< String, Obj .style( forwardDefaultStyle ) .graphColorGenerator( coloringAdapter ); - // Restore position - final int[] pos = ( int[] ) guiState.get( FRAME_POSITION_KEY ); - if ( null != pos && pos.length == 4 ) - options - .x( pos[ 0 ] ) - .y( pos[ 1 ] ) - .width( pos[ 2 ] ) - .height( pos[ 3 ] ); - - // Restore group handle. - restoreGroupHandle( groupHandle, guiState ); - final AutoNavigateFocusModel< TrackSchemeVertex, TrackSchemeEdge > navigateFocusModel = new AutoNavigateFocusModel<>( focusModel, navigationHandler, timepointModel ); @@ -181,15 +156,6 @@ public MamutViewTrackScheme( final ProjectModel appModel, final Map< String, Obj contextChooser, options ); - // Restore settings panel visibility. - final Boolean settingsPanelVisible = ( Boolean ) guiState.get( SETTINGS_PANEL_VISIBLE_KEY ); - if ( null != settingsPanelVisible ) - frame.setSettingsPanelVisible( settingsPanelVisible.booleanValue() ); - - // Default location. - if ( null == pos || pos.length != 4 ) - frame.setLocationRelativeTo( null ); - frame.getTrackschemePanel().setTimepointRange( appModel.getMinTimepoint(), appModel.getMaxTimepoint() ); frame.getTrackschemePanel().graphChanged(); contextListener.setContextListener( frame.getTrackschemePanel() ); @@ -200,37 +166,28 @@ public MamutViewTrackScheme( final ProjectModel appModel, final Map< String, Obj setFrame( frame ); - // Transform. - final ScreenTransform tLoaded = ( ScreenTransform ) guiState.get( TRACKSCHEME_TRANSFORM_KEY ); - if ( null != tLoaded ) - frame.getTrackschemePanel().getScreenTransform().set( tLoaded ); - MastodonFrameViewActions.install( viewActions, this ); HighlightBehaviours.install( viewBehaviours, viewGraph, viewGraph.getLock(), viewGraph, highlightModel, model ); - ToggleLinkBehaviour.install( viewBehaviours, frame.getTrackschemePanel(), viewGraph, viewGraph.getLock(), - viewGraph, model ); + ToggleLinkBehaviour.install( viewBehaviours, frame.getTrackschemePanel(), viewGraph, viewGraph.getLock(), viewGraph, model ); EditFocusVertexLabelAction.install( viewActions, frame.getTrackschemePanel(), focusModel, model ); FocusActions.install( viewActions, viewGraph, viewGraph.getLock(), navigateFocusModel, selectionModel ); TrackSchemeZoom.install( viewBehaviours, frame.getTrackschemePanel() ); EditTagActions.install( viewActions, frame.getKeybindings(), frame.getTriggerbindings(), model.getTagSetModel(), appModel.getSelectionModel(), viewGraph.getLock(), frame.getTrackschemePanel(), frame.getTrackschemePanel().getDisplay(), model ); - ShowSelectedTracksActions.install( viewActions, viewGraph, selectionModel, rootsModel, - frame.getTrackschemePanel() ); + ShowSelectedTracksActions.install( viewActions, viewGraph, selectionModel, rootsModel, frame.getTrackschemePanel() ); // Timepoint and number of spots. final TimepointAndNumberOfSpotsPanel timepointAndNumberOfSpotsPanel = new TimepointAndNumberOfSpotsPanel( timepointModel, model ); timepointAndNumberOfSpotsPanel.setAlignmentY( Component.CENTER_ALIGNMENT ); frame.getSettingsPanel().add( timepointAndNumberOfSpotsPanel ); - final JPanel searchPanel = SearchVertexLabel.install( viewActions, viewGraph, navigationHandler, selectionModel, - focusModel, frame.getTrackschemePanel() ); + final JPanel searchPanel = SearchVertexLabel.install( viewActions, viewGraph, navigationHandler, selectionModel, focusModel, frame.getTrackschemePanel() ); searchPanel.setAlignmentY( Component.CENTER_ALIGNMENT ); frame.getSettingsPanel().add( searchPanel ); // TODO Let the user choose between the two selection/focus modes. - frame.getTrackschemePanel().getNavigationActions().install( viewActions, - TrackSchemeNavigationActions.NavigatorEtiquette.FINDER_LIKE ); + frame.getTrackschemePanel().getNavigationActions().install( viewActions, TrackSchemeNavigationActions.NavigatorEtiquette.FINDER_LIKE ); frame.getTrackschemePanel().getNavigationBehaviours().install( viewBehaviours ); frame.getTrackschemePanel().getTransformEventHandler().install( viewBehaviours ); @@ -289,15 +246,8 @@ public MamutViewTrackScheme( final ProjectModel appModel, final Map< String, Obj model.getGraph().addVertexLabelListener( v -> SwingUtilities.invokeLater( () -> frame.getTrackschemePanel().entitiesAttributesChanged() ) ); - // Restore colorbar state. - restoreColorbarState( colorBarOverlay, guiState ); - - // Restore coloring. - restoreColoring( coloringModel, guiState ); - frame.getTrackschemePanel().getDisplay().overlays().add( colorBarOverlay ); - frame.setVisible( true ); frame.getTrackschemePanel().repaint(); // Give focus to the display so that it can receive key presses @@ -305,27 +255,25 @@ public MamutViewTrackScheme( final ProjectModel appModel, final Map< String, Obj frame.getTrackschemePanel().getDisplay().requestFocusInWindow(); } + @Override + public TrackSchemeFrame getFrame() + { + return ( TrackSchemeFrame ) super.getFrame(); + } + @Override public ContextChooser< Spot > getContextChooser() { return contextChooser; } + @Override public ColoringModelMain< Spot, Link, BranchSpot, BranchLink > getColoringModel() { return coloringModel; } - /** - * Exposes the {@link TrackSchemePanel} displayed in this view. - * - * @return the {@link TrackSchemePanel}. - */ - public TrackSchemePanel getTrackschemePanel() - { - return ( ( TrackSchemeFrame ) getFrame() ).getTrackschemePanel(); - } - + @Override public ColorBarOverlay getColorBarOverlay() { return colorBarOverlay; diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 7f6fd074d..bd9a2d8ad 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -31,7 +31,6 @@ import static org.mastodon.app.MastodonIcons.FEATURES_ICON; import static org.mastodon.app.MastodonIcons.TABLE_VIEW_ICON; import static org.mastodon.app.MastodonIcons.TAGS_ICON; -import static org.mastodon.app.MastodonIcons.TRACKSCHEME_VIEW_ICON; import java.awt.Desktop; import java.awt.Window; @@ -59,6 +58,9 @@ import org.mastodon.mamut.views.MamutViewI; import org.mastodon.mamut.views.bdv.MamutBranchViewBdvFactory; import org.mastodon.mamut.views.bdv.MamutViewBdvFactory; +import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeFactory; +import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeHierarchyFactory; +import org.mastodon.mamut.views.trackscheme.MamutViewTrackSchemeFactory; import org.mastodon.model.tag.ui.TagSetDialog; import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; @@ -484,8 +486,7 @@ public MamutViewTrackScheme createTrackScheme() */ public MamutViewTrackScheme createTrackScheme( final Map< String, Object > guiState ) { - final MamutViewTrackScheme view = new MamutViewTrackScheme( appModel, guiState ); - view.getFrame().setIconImages( TRACKSCHEME_VIEW_ICON ); + final MamutViewTrackScheme view = new MamutViewTrackSchemeFactory().show( appModel, guiState ); addTsWindow( view ); return view; } @@ -648,8 +649,7 @@ public MamutBranchViewTrackScheme createBranchTrackScheme() */ public MamutBranchViewTrackScheme createBranchTrackScheme( final Map< String, Object > guiState ) { - final MamutBranchViewTrackScheme view = new MamutBranchViewTrackScheme( appModel, guiState ); - view.getFrame().setIconImages( TRACKSCHEME_VIEW_ICON ); + final MamutBranchViewTrackScheme view = new MamutBranchViewTrackSchemeFactory().show( appModel, guiState ); addBTsWindow( view ); return view; } @@ -673,9 +673,7 @@ public MamutBranchViewTrackScheme createHierarchyTrackScheme() */ public MamutBranchViewTrackScheme createHierarchyTrackScheme( final Map< String, Object > guiState ) { - final MamutBranchViewTrackSchemeHierarchy view = - new MamutBranchViewTrackSchemeHierarchy( appModel, guiState ); - view.getFrame().setIconImages( TRACKSCHEME_VIEW_ICON ); + final MamutBranchViewTrackSchemeHierarchy view = new MamutBranchViewTrackSchemeHierarchyFactory().show( appModel, guiState ); addBTsWindow( view ); return view; } diff --git a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java index 149ee4055..e18c62c4f 100644 --- a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java +++ b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java @@ -43,7 +43,7 @@ import static org.mastodon.mamut.MamutViewTable.TABLE_NAME; import static org.mastodon.mamut.MamutViewTable.TABLE_SELECTION_ONLY; import static org.mastodon.mamut.MamutViewTable.TABLE_VISIBLE_POS; -import static org.mastodon.mamut.MamutViewTrackScheme.TRACKSCHEME_TRANSFORM_KEY; +import static org.mastodon.mamut.views.trackscheme.MamutViewTrackSchemeFactory.TRACKSCHEME_TRANSFORM_KEY; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; @@ -357,7 +357,7 @@ private static void getGuiStateTable( final MamutViewTable view, final Map< Stri */ private static void getGuiStateTrackScheme( final MamutViewTrackScheme view, final Map< String, Object > guiState ) { - final TrackSchemePanel trackschemePanel = view.getTrackschemePanel(); + final TrackSchemePanel trackschemePanel = view.getFrame().getTrackschemePanel(); // Edit position to reflect the fact that we store the TrackScheme panel // width and height. diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeFactory.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeFactory.java new file mode 100644 index 000000000..412ff4a54 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeFactory.java @@ -0,0 +1,32 @@ +package org.mastodon.mamut.views.trackscheme; + +import java.util.Map; + +import org.mastodon.mamut.MamutBranchViewTrackScheme; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.views.AbstractMamutViewFactory; + +public class MamutBranchViewTrackSchemeFactory extends AbstractMamutViewFactory< MamutBranchViewTrackScheme > +{ + + @Override + public MamutBranchViewTrackScheme create( final ProjectModel projectModel ) + { + return new MamutBranchViewTrackScheme( projectModel ); + } + + @Override + public Map< String, Object > getGuiState( final MamutBranchViewTrackScheme view ) + { + final Map< String, Object > guiState = super.getGuiState( view ); + MamutViewTrackSchemeFactory.storeTrackSchemeTransform( view.getFrame().getTrackschemePanel(), guiState ); + return guiState; + } + + @Override + public void restoreGuiState( final MamutBranchViewTrackScheme view, final Map< String, Object > guiState ) + { + super.restoreGuiState( view, guiState ); + MamutViewTrackSchemeFactory.restoreTrackSchemeTransform( view.getFrame().getTrackschemePanel(), guiState ); + } +} diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchyFactory.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchyFactory.java new file mode 100644 index 000000000..f31007d5e --- /dev/null +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchyFactory.java @@ -0,0 +1,32 @@ +package org.mastodon.mamut.views.trackscheme; + +import java.util.Map; + +import org.mastodon.mamut.MamutBranchViewTrackSchemeHierarchy; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.views.AbstractMamutViewFactory; + +public class MamutBranchViewTrackSchemeHierarchyFactory extends AbstractMamutViewFactory< MamutBranchViewTrackSchemeHierarchy > +{ + + @Override + public MamutBranchViewTrackSchemeHierarchy create( final ProjectModel projectModel ) + { + return new MamutBranchViewTrackSchemeHierarchy( projectModel ); + } + + @Override + public Map< String, Object > getGuiState( final MamutBranchViewTrackSchemeHierarchy view ) + { + final Map< String, Object > guiState = super.getGuiState( view ); + MamutViewTrackSchemeFactory.storeTrackSchemeTransform( view.getFrame().getTrackschemePanel(), guiState ); + return guiState; + } + + @Override + public void restoreGuiState( final MamutBranchViewTrackSchemeHierarchy view, final Map< String, Object > guiState ) + { + super.restoreGuiState( view, guiState ); + MamutViewTrackSchemeFactory.restoreTrackSchemeTransform( view.getFrame().getTrackschemePanel(), guiState ); + } +} diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackSchemeFactory.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackSchemeFactory.java new file mode 100644 index 000000000..d48f8a29e --- /dev/null +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackSchemeFactory.java @@ -0,0 +1,55 @@ +package org.mastodon.mamut.views.trackscheme; + +import java.util.Map; + +import org.mastodon.mamut.MamutViewTrackScheme; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.views.AbstractMamutViewFactory; +import org.mastodon.views.trackscheme.ScreenTransform; +import org.mastodon.views.trackscheme.display.TrackSchemePanel; + +public class MamutViewTrackSchemeFactory extends AbstractMamutViewFactory< MamutViewTrackScheme > +{ + + /** + * Key for the transform in a TrackScheme view. Value is a + * {@link ScreenTransform} instance. + */ + public static final String TRACKSCHEME_TRANSFORM_KEY = "TrackSchemeTransform"; + + @Override + public MamutViewTrackScheme create( final ProjectModel projectModel ) + { + return new MamutViewTrackScheme( projectModel ); + } + + @Override + public Map< String, Object > getGuiState( final MamutViewTrackScheme view ) + { + final Map< String, Object > guiState = super.getGuiState( view ); + storeTrackSchemeTransform( view.getFrame().getTrackschemePanel(), guiState ); + return guiState; + } + + @Override + public void restoreGuiState( final MamutViewTrackScheme view, final Map< String, Object > guiState ) + { + super.restoreGuiState( view, guiState ); + restoreTrackSchemeTransform( view.getFrame().getTrackschemePanel(), guiState ); + } + + static void storeTrackSchemeTransform( final TrackSchemePanel trackschemePanel, final Map< String, Object > guiState ) + { + // Transform. + final ScreenTransform t = trackschemePanel.getScreenTransform().get(); + guiState.put( TRACKSCHEME_TRANSFORM_KEY, t ); + } + + static void restoreTrackSchemeTransform( final TrackSchemePanel trackSchemePanel, final Map< String, Object > guiState ) + { + // Transform. + final ScreenTransform tLoaded = ( ScreenTransform ) guiState.get( TRACKSCHEME_TRANSFORM_KEY ); + if ( null != tLoaded ) + trackSchemePanel.getScreenTransform().set( tLoaded ); + } +} diff --git a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeFrame.java b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeFrame.java index 6be339f25..6f544d2c4 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeFrame.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeFrame.java @@ -28,6 +28,8 @@ */ package org.mastodon.views.trackscheme.display; +import static org.mastodon.app.MastodonIcons.TRACKSCHEME_VIEW_ICON; + import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.WindowAdapter; @@ -122,6 +124,7 @@ public void windowClosing( final WindowEvent e ) mouseAndKeyHandler.setKeypressManager( optional.values.getKeyPressedManager(), trackschemePanel.getDisplay() ); trackschemePanel.getDisplay().addHandler( mouseAndKeyHandler ); setLocation( optional.values.getX(), optional.values.getY() ); + setIconImages( TRACKSCHEME_VIEW_ICON ); } public TrackSchemePanel getTrackschemePanel() From 480bdc370ff8e3cee0f657b2f0e610d4913058d5 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 18 Aug 2023 20:37:32 +0200 Subject: [PATCH 035/220] Factory pattern for the table views. TODOs: - The selection table flag is not stored properly yet, because we still rely on MamutViewStateSerialization for GUI state serialization. - The context provider state serialization is not supported yet. --- .../org/mastodon/mamut/MamutViewTable.java | 172 +++--------------- .../org/mastodon/mamut/WindowManager.java | 23 +-- .../mamut/io/MamutViewStateSerialization.java | 18 +- .../mamut/views/AbstractMamutViewFactory.java | 21 ++- .../table/MamutViewSelectionTableFactory.java | 17 ++ .../views/table/MamutViewTableFactory.java | 164 +++++++++++++++++ 6 files changed, 246 insertions(+), 169 deletions(-) create mode 100644 src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java create mode 100644 src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java diff --git a/src/main/java/org/mastodon/mamut/MamutViewTable.java b/src/main/java/org/mastodon/mamut/MamutViewTable.java index c61583c3b..53cbe83fd 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTable.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTable.java @@ -28,18 +28,15 @@ */ package org.mastodon.mamut; +import static org.mastodon.app.MastodonIcons.TABLE_VIEW_ICON; import static org.mastodon.app.ui.ViewMenuBuilder.item; import static org.mastodon.app.ui.ViewMenuBuilder.separator; -import static org.mastodon.mamut.MamutBranchView.BRANCH_GRAPH; import static org.mastodon.mamut.MamutMenuBuilder.editMenu; import static org.mastodon.mamut.MamutMenuBuilder.fileMenu; import static org.mastodon.mamut.MamutMenuBuilder.tagSetMenu; import static org.mastodon.mamut.MamutMenuBuilder.viewMenu; -import java.awt.Point; -import java.util.Collections; import java.util.List; -import java.util.Map; import javax.swing.ActionMap; import javax.swing.JPanel; @@ -79,72 +76,22 @@ import org.mastodon.ui.coloring.ColoringModelMain; import org.mastodon.ui.coloring.GraphColorGenerator; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; +import org.mastodon.ui.coloring.HasColoringModel; import org.mastodon.ui.coloring.TagSetGraphColorGenerator; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.context.ContextChooser; import org.mastodon.views.context.HasContextChooser; -import org.mastodon.views.table.FeatureTagTablePanel; import org.mastodon.views.table.TableViewActions; import org.mastodon.views.table.TableViewFrameBuilder; import org.mastodon.views.table.TableViewFrameBuilder.MyTableViewFrame; import bdv.BigDataViewerActions; -public class MamutViewTable extends MamutView< ViewGraph< Spot, Link, Spot, Link >, Spot, Link > implements HasContextChooser< Spot > +public class MamutViewTable extends MamutView< ViewGraph< Spot, Link, Spot, Link >, Spot, Link > + implements HasContextChooser< Spot >, HasColoringModel { - /** - * Key that specifies whether a table only display the selection or the - * whole model. Boolean instance. - */ - public static final String TABLE_SELECTION_ONLY = "TableSelectionOnly"; - - /** - * Key that specifies whether a table is currently showing the vertex table. - * If false, then the edge table is displayed. - */ - public static final String TABLE_DISPLAYING_VERTEX_TABLE = "TableVertexTableDisplayed"; - - /** - * Key that specifies what table is currently showing in the table view. - * Values are String that points to a tab name in the tabbed - * pane. - */ - public static final String TABLE_DISPLAYED = "TableDisplayed"; - - /** - * Key to the parameter that stores the vertex table displayed rectangle. - * Value is and int[] array of 4 elements: x, y, width and - * height. - */ - public static final String TABLE_VERTEX_TABLE_VISIBLE_POS = "TableVertexTableVisibleRect"; - - /** - * Key to the parameter that stores the table displayed position. Value is - * and int[] array of 2 elements: x, y. - */ - public static final String TABLE_VISIBLE_POS = "TableVisibleRect"; - - /** - * Key to the parameter that stores the GUI states of multiple tables. Value - * is a List>. - */ - public static final String TABLE_ELEMENT = "Tables"; - - /** - * Key to the parameter that stores the table name in a table GUI state. - * Value is a String. - */ - public static final String TABLE_NAME = "TableName"; - - /** - * Key to the parameter that stores the edge table displayed rectangle. - * Value is and int[] array of 4 elements: x, y, width and - * height. - */ - public static final String TABLE_EDGE_TABLE_VISIBLE_POS = "TableEdgeTableVisibleRect"; - public static String csvExportPath = null; private static final String[] CONTEXTS = new String[] { KeyConfigContexts.TABLE }; @@ -153,15 +100,7 @@ public class MamutViewTable extends MamutView< ViewGraph< Spot, Link, Spot, Link private final ColoringModel branchColoringModel; - private final boolean selectionTable; - - public MamutViewTable( final ProjectModel appModel, final boolean selectionOnly ) - { - this( appModel, Collections.singletonMap( - TABLE_SELECTION_ONLY, Boolean.valueOf( selectionOnly ) ) ); - } - - public MamutViewTable( final ProjectModel appModel, final Map< String, Object > guiState ) + public MamutViewTable( final ProjectModel appModel, final boolean selectionTable ) { super( appModel, createViewGraph( appModel ), CONTEXTS ); @@ -181,50 +120,39 @@ public MamutViewTable( final ProjectModel appModel, final Map< String, Object > final GraphColorGeneratorAdapter< BranchSpot, BranchLink, BranchSpot, BranchLink > branchColoringAdapter = new GraphColorGeneratorAdapter<>( viewBranchGraph.getVertexMap(), viewBranchGraph.getEdgeMap() ); - // Selection table? - this.selectionTable = ( boolean ) guiState.getOrDefault( TABLE_SELECTION_ONLY, false ); - // Create tables. final TableViewFrameBuilder builder = new TableViewFrameBuilder(); final MyTableViewFrame frame = builder .groupHandle( groupHandle ) .undo( model ) .addGraph( model.getGraph() ) - .selectionModel( selectionModel ) - .highlightModel( highlightModel ) - .focusModel( focusModel ) - .featureModel( featureModel ) - .tagSetModel( tagSetModel ) - .navigationHandler( navigationHandler ) - .coloring( coloringAdapter ) - .vertexLabelGetter( s -> s.getLabel() ) - .vertexLabelSetter( ( s, label ) -> s.setLabel( label ) ) - .listenToContext( true ) - .selectionTable( selectionTable ) - .done() + .selectionModel( selectionModel ) + .highlightModel( highlightModel ) + .focusModel( focusModel ) + .featureModel( featureModel ) + .tagSetModel( tagSetModel ) + .navigationHandler( navigationHandler ) + .coloring( coloringAdapter ) + .vertexLabelGetter( s -> s.getLabel() ) + .vertexLabelSetter( ( s, label ) -> s.setLabel( label ) ) + .listenToContext( true ) + .selectionTable( selectionTable ) + .done() .addGraph( model.getBranchGraph() ) - .vertexLabelGetter( s -> s.getLabel() ) - .vertexLabelSetter( ( s, label ) -> s.setLabel( label ) ) - .featureModel( featureModel ) - .tagSetModel( branchTagSetModel( appModel ) ) - .selectionModel( branchSelectionModel( appModel ) ) - .highlightModel( branchHighlightModel( appModel ) ) - .coloring( branchColoringAdapter ) - .focusModel( branchFocusfocusModel( appModel ) ) - .navigationHandler( branchGraphNavigation( appModel, navigationHandler ) ) - .done() + .vertexLabelGetter( s -> s.getLabel() ) + .vertexLabelSetter( ( s, label ) -> s.setLabel( label ) ) + .featureModel( featureModel ) + .tagSetModel( branchTagSetModel( appModel ) ) + .selectionModel( branchSelectionModel( appModel ) ) + .highlightModel( branchHighlightModel( appModel ) ) + .coloring( branchColoringAdapter ) + .focusModel( branchFocusfocusModel( appModel ) ) + .navigationHandler( branchGraphNavigation( appModel, navigationHandler ) ) + .done() .title( selectionTable ? "Selection table" : "Data table" ) .get(); setFrame( frame ); - - // Restore position. - restoreFramePosition( frame, guiState ); - - // Restore group handle. - restoreGroupHandle( groupHandle, guiState ); - - // Restore settings panel visibility. - restoreSettingsPanelVisibility( frame, guiState ); + frame.setIconImages( TABLE_VIEW_ICON ); // Search panels. final JPanel searchPanel = SearchVertexLabel.install( viewActions, viewGraph, navigationHandler, selectionModel, @@ -273,14 +201,6 @@ public MamutViewTable( final ProjectModel appModel, final Map< String, Object > branchColoringModel = registerBranchColoring( appModel, branchColoringAdapter, colorBranchMenuHandle, () -> frame.repaint(), runOnClose ); - // Restore coloring. - restoreColoring( coloringModel, guiState ); - - // Restore branch-graph coloring. - @SuppressWarnings( "unchecked" ) - final Map< String, Object > branchGraphGuiState = ( Map< String, Object > ) guiState.get( BRANCH_GRAPH ); - restoreColoring( branchColoringModel, branchGraphGuiState ); - /* * Register a listener to vertex label property changes, will update the * table-view when the label change. @@ -289,36 +209,6 @@ public MamutViewTable( final ProjectModel appModel, final Map< String, Object > final PropertyChangeListener< Spot > labelChangedRefresher = v -> frame.repaint(); spotPool.labelProperty().propertyChangeListeners().add( labelChangedRefresher ); onClose( () -> spotPool.labelProperty().propertyChangeListeners().remove( labelChangedRefresher ) ); - - // Restore table visible rectangle and displayed table. - final String displayedTableName = ( String ) guiState.getOrDefault( TABLE_DISPLAYED, "TableSpot" ); - final List< FeatureTagTablePanel< ? > > tables = frame.getTables(); - final List< String > names = frame.getTableNames(); - @SuppressWarnings( "unchecked" ) - final List< Map< String, Object > > list = - ( List< Map< String, Object > > ) guiState.getOrDefault( TABLE_ELEMENT, Collections.emptyList() ); - for ( int i = 0; i < list.size(); i++ ) - { - final String name = names.get( i ); - if ( name.equals( displayedTableName ) ) - frame.displayTable( name ); - - final Map< String, Object > tableGuiState = list.get( i ); - final int[] viewPos = ( int[] ) tableGuiState.get( TABLE_VISIBLE_POS ); - if ( viewPos != null ) - { - final FeatureTagTablePanel< ? > table = tables.get( i ); - table.getScrollPane().getViewport().setViewPosition( new Point( - viewPos[ 0 ], - viewPos[ 1 ] ) ); - } - } - - /* - * Show table. - */ - - frame.setVisible( true ); } private static final ColoringModel registerBranchColoring( @@ -439,6 +329,7 @@ public ContextChooser< Spot > getContextChooser() * De/serialization related methods. */ + @Override public ColoringModelMain< Spot, Link, BranchSpot, BranchLink > getColoringModel() { return coloringModel; @@ -449,11 +340,6 @@ public ColoringModel getBranchColoringModel() return branchColoringModel; } - public boolean isSelectionTable() - { - return selectionTable; - } - /* * Functions. */ diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index bd9a2d8ad..054629cef 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -29,7 +29,6 @@ package org.mastodon.mamut; import static org.mastodon.app.MastodonIcons.FEATURES_ICON; -import static org.mastodon.app.MastodonIcons.TABLE_VIEW_ICON; import static org.mastodon.app.MastodonIcons.TAGS_ICON; import java.awt.Desktop; @@ -55,9 +54,12 @@ import org.mastodon.mamut.feature.MamutFeatureProjectionsManager; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; +import org.mastodon.mamut.views.MamutViewFactory; import org.mastodon.mamut.views.MamutViewI; import org.mastodon.mamut.views.bdv.MamutBranchViewBdvFactory; import org.mastodon.mamut.views.bdv.MamutViewBdvFactory; +import org.mastodon.mamut.views.table.MamutViewSelectionTableFactory; +import org.mastodon.mamut.views.table.MamutViewTableFactory; import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeFactory; import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeHierarchyFactory; import org.mastodon.mamut.views.trackscheme.MamutViewTrackSchemeFactory; @@ -498,12 +500,6 @@ public MamutViewTrackScheme createTrackScheme( final Map< String, Object > guiSt * The display settings are specified as a map of strings to objects. The * accepted key and value types are: *

    - *
  • 'TableSelectionOnly' → a boolean specifying whether - * the table to create will be a selection table of a full table. If - * true, the table will only display the current content of the - * selection, and will listen to its changes. If false, the - * table will display the full graph content, listen to its changes, and - * will be able to edit the selection. *
  • 'FramePosition' → an int[] array of 4 * elements: x, y, width and height. *
  • 'LockGroupId' → an integer that specifies the lock @@ -528,10 +524,13 @@ public MamutViewTrackScheme createTrackScheme( final Map< String, Object > guiSt * @param guiState * the map of settings. */ - public MamutViewTable createTable( final Map< String, Object > guiState ) + public MamutViewTable createTable( final boolean selectionOnly, final Map< String, Object > guiState ) { - final MamutViewTable view = new MamutViewTable( appModel, guiState ); - view.getFrame().setIconImages( TABLE_VIEW_ICON ); + + final MamutViewFactory< ? > factory = selectionOnly + ? new MamutViewSelectionTableFactory() + : new MamutViewTableFactory(); + final MamutViewTable view = ( MamutViewTable ) factory.show( appModel, guiState ); addTableWindow( view ); return view; } @@ -550,9 +549,7 @@ public MamutViewTable createTable( final Map< String, Object > guiState ) */ public MamutViewTable createTable( final boolean selectionOnly ) { - final Map< String, Object > guiState = Collections.singletonMap( - MamutViewTable.TABLE_SELECTION_ONLY, Boolean.valueOf( selectionOnly ) ); - return createTable( guiState ); + return createTable( selectionOnly, Collections.emptyMap() ); } /** diff --git a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java index e18c62c4f..3107aeb88 100644 --- a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java +++ b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java @@ -38,11 +38,10 @@ import static org.mastodon.mamut.MamutView.SETTINGS_PANEL_VISIBLE_KEY; import static org.mastodon.mamut.MamutView.TAG_SET_KEY; import static org.mastodon.mamut.MamutViewGrapher.GRAPHER_TRANSFORM_KEY; -import static org.mastodon.mamut.MamutViewTable.TABLE_DISPLAYED; -import static org.mastodon.mamut.MamutViewTable.TABLE_ELEMENT; -import static org.mastodon.mamut.MamutViewTable.TABLE_NAME; -import static org.mastodon.mamut.MamutViewTable.TABLE_SELECTION_ONLY; -import static org.mastodon.mamut.MamutViewTable.TABLE_VISIBLE_POS; +import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_DISPLAYED; +import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_ELEMENT; +import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_NAME; +import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_VISIBLE_POS; import static org.mastodon.mamut.views.trackscheme.MamutViewTrackSchemeFactory.TRACKSCHEME_TRANSFORM_KEY; import java.awt.GraphicsDevice; @@ -300,9 +299,6 @@ private static void getGuiStateGrapher( final MamutViewGrapher view, final Map< */ private static void getGuiStateTable( final MamutViewTable view, final Map< String, Object > guiState ) { - // Selection table or not. - guiState.put( TABLE_SELECTION_ONLY, view.isSelectionTable() ); - // Currently displayed table. final FeatureTagTablePanel< ? > currentlyDisplayedTable = view.getFrame().getCurrentlyDisplayedTable(); String displayedTableName = ""; @@ -565,9 +561,10 @@ static void fromXml( final Element windowsEl, final WindowManager windowManager case "MamutViewTable": { - final MamutViewTable table = windowManager.createTable( guiState ); + final boolean selectionOnly = false; // FIXME + final MamutViewTable table = windowManager.createTable( selectionOnly, guiState ); - // Deal with context chooser. + // Deal with context chooser. // FIXME final String desiredProvider = ( String ) guiState.get( CHOSEN_CONTEXT_PROVIDER_KEY ); if ( null != desiredProvider ) contextChosers.put( table.getContextChooser(), desiredProvider ); @@ -645,7 +642,6 @@ private static Map< String, Object > xmlToMap( final Element viewEl ) arr[ 3 ], ( int ) arr[ 4 ], ( int ) arr[ 5 ] ); break; } - case TABLE_SELECTION_ONLY: case NO_COLORING_KEY: case SETTINGS_PANEL_VISIBLE_KEY: case COLORBAR_VISIBLE_KEY: diff --git a/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java b/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java index f9a2000f1..6a8e33f3c 100644 --- a/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java +++ b/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java @@ -84,8 +84,8 @@ public Map< String, Object > getGuiState( final T view ) /** * Reads the coloring state of a view and stores it into the specified map. * - * @param coloringModel - * the coloring model to read from. + * @param view + * the view to get the coloring model from. * @param guiState * the map to store it to. */ @@ -95,6 +95,19 @@ private static void getColoringState( final MamutViewI view, final Map< String, return; final ColoringModel coloringModel = ( ( HasColoringModel ) view ).getColoringModel(); + getColoringState( coloringModel, guiState ); + } + + /** + * Reads the coloring state and stores it into the specified map. + * + * @param coloringModel + * the coloring model to read from. + * @param guiState + * the map to store it to. + */ + protected static void getColoringState( final ColoringModel coloringModel, final Map< String, Object > guiState ) + { final boolean noColoring = coloringModel.noColoring(); guiState.put( NO_COLORING_KEY, noColoring ); if ( !noColoring ) @@ -124,7 +137,11 @@ private static void restoreColoringModel( final MamutViewI viewraw, final Map< S return; final ColoringModel coloringModel = ( ( HasColoringModel ) viewraw ).getColoringModel(); + restoreColoringModel( coloringModel, guiState ); + } + protected static void restoreColoringModel( final ColoringModel coloringModel, final Map< String, Object > guiState ) + { final Boolean noColoring = ( Boolean ) guiState.get( NO_COLORING_KEY ); if ( null != noColoring && noColoring ) { diff --git a/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java b/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java new file mode 100644 index 000000000..b54ef1159 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java @@ -0,0 +1,17 @@ +package org.mastodon.mamut.views.table; + +import org.mastodon.mamut.MamutViewTable; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.views.MamutViewFactory; +import org.scijava.plugin.Plugin; + +@Plugin( type = MamutViewFactory.class ) +public class MamutViewSelectionTableFactory extends MamutViewTableFactory +{ + + @Override + public MamutViewTable create( final ProjectModel projectModel ) + { + return new MamutViewTable( projectModel, true ); + } +} diff --git a/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java b/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java new file mode 100644 index 000000000..0ab8717ee --- /dev/null +++ b/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java @@ -0,0 +1,164 @@ +package org.mastodon.mamut.views.table; + +import static org.mastodon.mamut.MamutBranchView.BRANCH_GRAPH; + +import java.awt.Point; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.swing.JViewport; + +import org.mastodon.mamut.MamutViewTable; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.views.AbstractMamutViewFactory; +import org.mastodon.mamut.views.MamutViewFactory; +import org.mastodon.ui.coloring.ColoringModel; +import org.mastodon.views.table.FeatureTagTablePanel; +import org.mastodon.views.table.TableViewFrameBuilder.MyTableViewFrame; +import org.scijava.plugin.Plugin; + +@Plugin( type = MamutViewFactory.class ) +public class MamutViewTableFactory extends AbstractMamutViewFactory< MamutViewTable > +{ + + /** + * Key that specifies whether a table is currently showing the vertex table. + * If false, then the edge table is displayed. + */ + public static final String TABLE_DISPLAYING_VERTEX_TABLE = "TableVertexTableDisplayed"; + + /** + * Key that specifies what table is currently showing in the table view. + * Values are String that points to a tab name in the tabbed + * pane. + */ + public static final String TABLE_DISPLAYED = "TableDisplayed"; + + /** + * Key to the parameter that stores the vertex table displayed rectangle. + * Value is and int[] array of 4 elements: x, y, width and + * height. + */ + public static final String TABLE_VERTEX_TABLE_VISIBLE_POS = "TableVertexTableVisibleRect"; + + /** + * Key to the parameter that stores the table displayed position. Value is + * and int[] array of 2 elements: x, y. + */ + public static final String TABLE_VISIBLE_POS = "TableVisibleRect"; + + /** + * Key to the parameter that stores the GUI states of multiple tables. Value + * is a List>. + */ + public static final String TABLE_ELEMENT = "Tables"; + + /** + * Key to the parameter that stores the table name in a table GUI state. + * Value is a String. + */ + public static final String TABLE_NAME = "TableName"; + + /** + * Key to the parameter that stores the edge table displayed rectangle. + * Value is and int[] array of 4 elements: x, y, width and + * height. + */ + public static final String TABLE_EDGE_TABLE_VISIBLE_POS = "TableEdgeTableVisibleRect"; + + @Override + public MamutViewTable create( final ProjectModel projectModel ) + { + return new MamutViewTable( projectModel, false ); + } + + @Override + public Map< String, Object > getGuiState( final MamutViewTable view ) + { + final Map< String, Object > guiState = super.getGuiState( view ); + getGuiStateTable( view, guiState ); + return guiState; + } + + static void getGuiStateTable( final MamutViewTable view, final Map< String, Object > guiState ) + { + // Currently displayed table. + final FeatureTagTablePanel< ? > currentlyDisplayedTable = view.getFrame().getCurrentlyDisplayedTable(); + String displayedTableName = ""; + + // Table visible rectangles. + final List< FeatureTagTablePanel< ? > > tables = view.getFrame().getTables(); + final List< String > names = view.getFrame().getTableNames(); + final List< Map< String, Object > > tableGuiStates = new ArrayList<>( names.size() ); + for ( int i = 0; i < names.size(); i++ ) + { + final String name = names.get( i ); + final FeatureTagTablePanel< ? > table = tables.get( i ); + + if ( table == currentlyDisplayedTable ) + displayedTableName = name; + + final JViewport viewportVertex = table.getScrollPane().getViewport(); + final Point tableRect = viewportVertex.getViewPosition(); + + final LinkedHashMap< String, Object > tableGuiState = new LinkedHashMap<>(); + tableGuiState.put( TABLE_NAME, name ); + tableGuiState.put( TABLE_VISIBLE_POS, new int[] { + tableRect.x, + tableRect.y } ); + + tableGuiStates.add( tableGuiState ); + } + guiState.put( TABLE_ELEMENT, tableGuiStates ); + guiState.put( TABLE_DISPLAYED, displayedTableName ); + + // Coloring for core graph. + final ColoringModel coloringModel = view.getColoringModel(); + getColoringState( coloringModel, guiState ); + + // Coloring for branch-graph. + final ColoringModel branchColoringModel = view.getBranchColoringModel(); + final Map< String, Object > branchGraphMap = new HashMap<>(); + getColoringState( branchColoringModel, branchGraphMap ); + guiState.put( BRANCH_GRAPH, branchGraphMap ); + } + + @Override + public void restoreGuiState( final MamutViewTable view, final Map< String, Object > guiState ) + { + super.restoreGuiState( view, guiState ); + // Restore branch-graph coloring. + @SuppressWarnings( "unchecked" ) + final Map< String, Object > branchGraphGuiState = ( Map< String, Object > ) guiState.getOrDefault( BRANCH_GRAPH, Collections.EMPTY_MAP ); + restoreColoringModel( view.getBranchColoringModel(), branchGraphGuiState ); + + // Restore table visible rectangle and displayed table. + final MyTableViewFrame frame = view.getFrame(); + final String displayedTableName = ( String ) guiState.getOrDefault( TABLE_DISPLAYED, "TableSpot" ); + final List< FeatureTagTablePanel< ? > > tables = frame.getTables(); + final List< String > names = frame.getTableNames(); + @SuppressWarnings( "unchecked" ) + final List< Map< String, Object > > list = + ( List< Map< String, Object > > ) guiState.getOrDefault( TABLE_ELEMENT, Collections.emptyList() ); + for ( int i = 0; i < list.size(); i++ ) + { + final String name = names.get( i ); + if ( name.equals( displayedTableName ) ) + frame.displayTable( name ); + + final Map< String, Object > tableGuiState = list.get( i ); + final int[] viewPos = ( int[] ) tableGuiState.get( TABLE_VISIBLE_POS ); + if ( viewPos != null ) + { + final FeatureTagTablePanel< ? > table = tables.get( i ); + table.getScrollPane().getViewport().setViewPosition( new Point( + viewPos[ 0 ], + viewPos[ 1 ] ) ); + } + } + } +} From 48146a952168dd65229512a1c9928d861c1f5c7e Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Sat, 19 Aug 2023 10:20:37 +0200 Subject: [PATCH 036/220] Use a separate class for selection tables. We may want to use class objects as keys when managing factories. --- .../mamut/MamutViewSelectionTable.java | 10 +++++++ .../org/mastodon/mamut/MamutViewTable.java | 29 +++++++++++-------- .../table/MamutViewSelectionTableFactory.java | 3 +- .../views/table/MamutViewTableFactory.java | 2 +- 4 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 src/main/java/org/mastodon/mamut/MamutViewSelectionTable.java diff --git a/src/main/java/org/mastodon/mamut/MamutViewSelectionTable.java b/src/main/java/org/mastodon/mamut/MamutViewSelectionTable.java new file mode 100644 index 000000000..28ec8cae7 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/MamutViewSelectionTable.java @@ -0,0 +1,10 @@ +package org.mastodon.mamut; + +public class MamutViewSelectionTable extends MamutViewTable +{ + + public MamutViewSelectionTable( final ProjectModel projectModel ) + { + super( projectModel, true ); + } +} diff --git a/src/main/java/org/mastodon/mamut/MamutViewTable.java b/src/main/java/org/mastodon/mamut/MamutViewTable.java index 53cbe83fd..9f0e8158f 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTable.java +++ b/src/main/java/org/mastodon/mamut/MamutViewTable.java @@ -100,12 +100,17 @@ public class MamutViewTable extends MamutView< ViewGraph< Spot, Link, Spot, Link private final ColoringModel branchColoringModel; - public MamutViewTable( final ProjectModel appModel, final boolean selectionTable ) + public MamutViewTable( final ProjectModel projectModel ) { - super( appModel, createViewGraph( appModel ), CONTEXTS ); + this( projectModel, false ); + } + + protected MamutViewTable( final ProjectModel projectModel, final boolean selectionTable ) + { + super( projectModel, createViewGraph( projectModel ), CONTEXTS ); // Data model. - final Model model = appModel.getModel(); + final Model model = projectModel.getModel(); final FeatureModel featureModel = model.getFeatureModel(); final TagSetModel< Spot, Link > tagSetModel = model.getTagSetModel(); @@ -142,12 +147,12 @@ public MamutViewTable( final ProjectModel appModel, final boolean selectionTable .vertexLabelGetter( s -> s.getLabel() ) .vertexLabelSetter( ( s, label ) -> s.setLabel( label ) ) .featureModel( featureModel ) - .tagSetModel( branchTagSetModel( appModel ) ) - .selectionModel( branchSelectionModel( appModel ) ) - .highlightModel( branchHighlightModel( appModel ) ) + .tagSetModel( branchTagSetModel( projectModel ) ) + .selectionModel( branchSelectionModel( projectModel ) ) + .highlightModel( branchHighlightModel( projectModel ) ) .coloring( branchColoringAdapter ) - .focusModel( branchFocusfocusModel( appModel ) ) - .navigationHandler( branchGraphNavigation( appModel, navigationHandler ) ) + .focusModel( branchFocusfocusModel( projectModel ) ) + .navigationHandler( branchGraphNavigation( projectModel, navigationHandler ) ) .done() .title( selectionTable ? "Selection table" : "Data table" ) .get(); @@ -164,7 +169,7 @@ public MamutViewTable( final ProjectModel appModel, final boolean selectionTable TableViewActions.install( viewActions, frame ); // Menus - final ViewMenu menu = new ViewMenu( frame.getJMenuBar(), appModel.getKeymap(), CONTEXTS ); + final ViewMenu menu = new ViewMenu( frame.getJMenuBar(), projectModel.getKeymap(), CONTEXTS ); final ActionMap actionMap = frame.getKeybindings().getConcatenatedActionMap(); final JMenuHandle colorMenuHandle = new JMenuHandle(); final JMenuHandle colorBranchMenuHandle = new JMenuHandle(); @@ -195,17 +200,17 @@ public MamutViewTable( final ProjectModel appModel, final boolean selectionTable ViewMenuBuilder.menu( "Settings", item( BigDataViewerActions.BRIGHTNESS_SETTINGS ), item( BigDataViewerActions.VISIBILITY_AND_GROUPING ) ) ); - appModel.getPlugins().addMenus( menu ); + projectModel.getPlugins().addMenus( menu ); coloringModel = registerColoring( coloringAdapter, colorMenuHandle, () -> frame.repaint() ); - branchColoringModel = registerBranchColoring( appModel, branchColoringAdapter, colorBranchMenuHandle, + branchColoringModel = registerBranchColoring( projectModel, branchColoringAdapter, colorBranchMenuHandle, () -> frame.repaint(), runOnClose ); /* * Register a listener to vertex label property changes, will update the * table-view when the label change. */ - final SpotPool spotPool = ( SpotPool ) appModel.getModel().getGraph().vertices().getRefPool(); + final SpotPool spotPool = ( SpotPool ) projectModel.getModel().getGraph().vertices().getRefPool(); final PropertyChangeListener< Spot > labelChangedRefresher = v -> frame.repaint(); spotPool.labelProperty().propertyChangeListeners().add( labelChangedRefresher ); onClose( () -> spotPool.labelProperty().propertyChangeListeners().remove( labelChangedRefresher ) ); diff --git a/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java b/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java index b54ef1159..9394bd45a 100644 --- a/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java +++ b/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java @@ -1,5 +1,6 @@ package org.mastodon.mamut.views.table; +import org.mastodon.mamut.MamutViewSelectionTable; import org.mastodon.mamut.MamutViewTable; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.MamutViewFactory; @@ -12,6 +13,6 @@ public class MamutViewSelectionTableFactory extends MamutViewTableFactory @Override public MamutViewTable create( final ProjectModel projectModel ) { - return new MamutViewTable( projectModel, true ); + return new MamutViewSelectionTable( projectModel ); } } diff --git a/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java b/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java index 0ab8717ee..ec2438547 100644 --- a/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java +++ b/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java @@ -73,7 +73,7 @@ public class MamutViewTableFactory extends AbstractMamutViewFactory< MamutViewTa @Override public MamutViewTable create( final ProjectModel projectModel ) { - return new MamutViewTable( projectModel, false ); + return new MamutViewTable( projectModel ); } @Override From c0000b92b974fa4031da3e4b1617f52698fe9b4e Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Sat, 19 Aug 2023 10:27:34 +0200 Subject: [PATCH 037/220] Factory pattern for grapher views. --- .../org/mastodon/mamut/MamutViewGrapher.java | 98 ++----------------- .../org/mastodon/mamut/WindowManager.java | 4 +- .../mamut/io/MamutViewStateSerialization.java | 2 +- .../grapher/MamutViewGrapherFactory.java | 46 +++++++++ .../grapher/display/DataDisplayFrame.java | 3 + 5 files changed, 58 insertions(+), 95 deletions(-) create mode 100644 src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java diff --git a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java index 9dfdc9ff5..3881db5c5 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java +++ b/src/main/java/org/mastodon/mamut/MamutViewGrapher.java @@ -36,11 +36,6 @@ import static org.mastodon.mamut.MamutMenuBuilder.tagSetMenu; import static org.mastodon.mamut.MamutMenuBuilder.viewMenu; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import javax.swing.ActionMap; import javax.swing.JPanel; @@ -56,15 +51,14 @@ import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; import org.mastodon.model.AutoNavigateFocusModel; -import org.mastodon.model.tag.TagSetStructure.TagSet; import org.mastodon.ui.EditTagActions; import org.mastodon.ui.FocusActions; import org.mastodon.ui.SelectionActions; import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColoringModelMain; import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; -import org.mastodon.ui.coloring.ColorBarOverlay.Position; -import org.mastodon.ui.coloring.feature.FeatureColorMode; +import org.mastodon.ui.coloring.HasColorBarOverlay; +import org.mastodon.ui.coloring.HasColoringModel; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.context.ContextChooser; import org.mastodon.views.context.HasContextChooser; @@ -73,7 +67,6 @@ import org.mastodon.views.grapher.datagraph.DataGraph; import org.mastodon.views.grapher.datagraph.DataGraphLayout; import org.mastodon.views.grapher.datagraph.DataVertex; -import org.mastodon.views.grapher.datagraph.ScreenTransform; import org.mastodon.views.grapher.display.DataDisplayFrame; import org.mastodon.views.grapher.display.DataDisplayOptions; import org.mastodon.views.grapher.display.DataDisplayPanel; @@ -87,15 +80,9 @@ import org.mastodon.views.trackscheme.display.TrackSchemeNavigationActions; import org.scijava.ui.behaviour.KeyPressedManager; -public class MamutViewGrapher extends MamutView< DataGraph< Spot, Link >, DataVertex, DataEdge > implements HasContextChooser< Spot > +public class MamutViewGrapher extends MamutView< DataGraph< Spot, Link >, DataVertex, DataEdge > implements HasContextChooser< Spot >, HasColoringModel, HasColorBarOverlay { - /** - * Key for the transform in a Grapher view. Value is a Grapher - * ScreenTransform instance. - */ - public static final String GRAPHER_TRANSFORM_KEY = "GrapherTransform"; - private final ContextChooser< Spot > contextChooser; /** @@ -115,11 +102,6 @@ public class MamutViewGrapher extends MamutView< DataGraph< Spot, Link >, DataVe private final ColorBarOverlay colorbarOverlay; public MamutViewGrapher( final ProjectModel appModel ) - { - this( appModel, new HashMap<>() ); - } - - public MamutViewGrapher( final ProjectModel appModel, final Map< String, Object > guiState ) { super( appModel, new DataGraph< Spot, Link >( @@ -180,26 +162,6 @@ public MamutViewGrapher( final ProjectModel appModel, final Map< String, Object new FeatureGraphConfig( spvx, spvy, GraphDataItemsSource.TRACK_OF_SELECTION, true ); frame.getVertexSidePanel().setGraphConfig( gcv ); - // Restore position - final int[] pos = ( int[] ) guiState.get( FRAME_POSITION_KEY ); - if ( null != pos && pos.length == 4 ) - frame.setBounds( pos[ 0 ], pos[ 1 ], pos[ 2 ], pos[ 3 ] ); - else - { - frame.setSize( options.values.getWidth(), options.values.getHeight() ); - frame.setLocationRelativeTo( null ); - } - - // Restore group handle. - final Integer groupID = ( Integer ) guiState.get( GROUP_HANDLE_ID_KEY ); - if ( null != groupID ) - groupHandle.setGroupId( groupID.intValue() ); - - // Restore settings panel visibility. - final Boolean settingsPanelVisible = ( Boolean ) guiState.get( SETTINGS_PANEL_VISIBLE_KEY ); - if ( null != settingsPanelVisible ) - frame.setSettingsPanelVisible( settingsPanelVisible.booleanValue() ); - dataDisplayPanel.graphChanged(); contextListener.setContextListener( dataDisplayPanel ); @@ -209,11 +171,6 @@ public MamutViewGrapher( final ProjectModel appModel, final Map< String, Object setFrame( frame ); - // Transform. - final ScreenTransform tLoaded = ( ScreenTransform ) guiState.get( GRAPHER_TRANSFORM_KEY ); - if ( null != tLoaded ) - dataDisplayPanel.getScreenTransform().set( tLoaded ); - MastodonFrameViewActions.install( viewActions, this ); FocusActions.install( viewActions, viewGraph, viewGraph.getLock(), navigateFocusModel, selectionModel ); EditTagActions.install( viewActions, frame.getKeybindings(), frame.getTriggerbindings(), model.getTagSetModel(), @@ -270,57 +227,12 @@ public MamutViewGrapher( final ProjectModel appModel, final Map< String, Object final OffsetAxes offset = dataDisplayPanel.getOffsetAxes(); offset.listeners().add( ( w, h ) -> colorbarOverlay.setInsets( 15, w + 15, h + 15, 15 ) ); registerColorbarOverlay( colorbarOverlay, colorbarMenuHandle, () -> dataDisplayPanel.repaint() ); - - // Restore colorbar state. - final boolean colorbarVisible = ( boolean ) guiState.getOrDefault( COLORBAR_VISIBLE_KEY, false ); - final Position colorbarPosition = - ( Position ) guiState.getOrDefault( COLORBAR_POSITION_KEY, Position.BOTTOM_RIGHT ); - colorbarOverlay.setVisible( colorbarVisible ); - colorbarOverlay.setPosition( colorbarPosition ); + dataDisplayPanel.getDisplay().overlays().add( colorbarOverlay ); // Listen to label changes. model.getGraph().addVertexLabelListener( v -> dataDisplayPanel.entitiesAttributesChanged() ); - // Restore coloring. - final Boolean noColoring = ( Boolean ) guiState.get( NO_COLORING_KEY ); - if ( null != noColoring && noColoring ) - { - coloringModel.colorByNone(); - } - else - { - final String tagSetName = ( String ) guiState.get( TAG_SET_KEY ); - final String featureColorModeName = ( String ) guiState.get( FEATURE_COLOR_MODE_KEY ); - if ( null != tagSetName ) - { - for ( final TagSet tagSet : coloringModel.getTagSetStructure().getTagSets() ) - { - if ( tagSet.getName().equals( tagSetName ) ) - { - coloringModel.colorByTagSet( tagSet ); - break; - } - } - } - else if ( null != featureColorModeName ) - { - final List< FeatureColorMode > featureColorModes = new ArrayList<>(); - featureColorModes.addAll( coloringModel.getFeatureColorModeManager().getBuiltinStyles() ); - featureColorModes.addAll( coloringModel.getFeatureColorModeManager().getUserStyles() ); - for ( final FeatureColorMode featureColorMode : featureColorModes ) - { - if ( featureColorMode.getName().equals( featureColorModeName ) ) - { - coloringModel.colorByFeature( featureColorMode ); - break; - } - } - } - } - dataDisplayPanel.getDisplay().overlays().add( colorbarOverlay ); - layout.layout(); - frame.setVisible( true ); dataDisplayPanel.repaint(); dataDisplayPanel.getDisplay().requestFocusInWindow(); } @@ -336,11 +248,13 @@ public DataDisplayPanel< Spot, Link > getDataDisplayPanel() return dataDisplayPanel; } + @Override public ColoringModelMain< Spot, Link, BranchSpot, BranchLink > getColoringModel() { return coloringModel; } + @Override public ColorBarOverlay getColorBarOverlay() { return colorbarOverlay; diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 054629cef..3c4fd4fa9 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -58,6 +58,7 @@ import org.mastodon.mamut.views.MamutViewI; import org.mastodon.mamut.views.bdv.MamutBranchViewBdvFactory; import org.mastodon.mamut.views.bdv.MamutViewBdvFactory; +import org.mastodon.mamut.views.grapher.MamutViewGrapherFactory; import org.mastodon.mamut.views.table.MamutViewSelectionTableFactory; import org.mastodon.mamut.views.table.MamutViewTableFactory; import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeFactory; @@ -597,8 +598,7 @@ public MamutViewGrapher createGrapher() */ public MamutViewGrapher createGrapher( final Map< String, Object > guiState ) { - final MamutViewGrapher view = new MamutViewGrapher( appModel, guiState ); - view.getFrame().setIconImages( FEATURES_ICON ); + final MamutViewGrapher view = new MamutViewGrapherFactory().show( appModel, guiState ); addGrapherWindow( view ); return view; } diff --git a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java index 3107aeb88..298f2e2d0 100644 --- a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java +++ b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java @@ -37,7 +37,7 @@ import static org.mastodon.mamut.MamutView.NO_COLORING_KEY; import static org.mastodon.mamut.MamutView.SETTINGS_PANEL_VISIBLE_KEY; import static org.mastodon.mamut.MamutView.TAG_SET_KEY; -import static org.mastodon.mamut.MamutViewGrapher.GRAPHER_TRANSFORM_KEY; +import static org.mastodon.mamut.views.grapher.MamutViewGrapherFactory.GRAPHER_TRANSFORM_KEY; import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_DISPLAYED; import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_ELEMENT; import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_NAME; diff --git a/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java b/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java new file mode 100644 index 000000000..1c90e5b58 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java @@ -0,0 +1,46 @@ +package org.mastodon.mamut.views.grapher; + +import java.util.Map; + +import org.mastodon.mamut.MamutViewGrapher; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.views.AbstractMamutViewFactory; +import org.mastodon.mamut.views.MamutViewFactory; +import org.mastodon.views.grapher.datagraph.ScreenTransform; +import org.scijava.plugin.Plugin; + +@Plugin( type = MamutViewFactory.class ) +public class MamutViewGrapherFactory extends AbstractMamutViewFactory< MamutViewGrapher > +{ + + /** + * Key for the transform in a Grapher view. Value is a Grapher + * ScreenTransform instance. + */ + public static final String GRAPHER_TRANSFORM_KEY = "GrapherTransform"; + + @Override + public MamutViewGrapher create( final ProjectModel projectModel ) + { + return new MamutViewGrapher( projectModel ); + } + + @Override + public Map< String, Object > getGuiState( final MamutViewGrapher view ) + { + final Map< String, Object > guiState = super.getGuiState( view ); + return guiState; + } + + + @Override + public void restoreGuiState( final MamutViewGrapher view, final Map< String, Object > guiState ) + { + super.restoreGuiState( view, guiState ); + + // Transform. + final ScreenTransform tLoaded = ( ScreenTransform ) guiState.get( GRAPHER_TRANSFORM_KEY ); + if ( null != tLoaded ) + view.getDataDisplayPanel().getScreenTransform().set( tLoaded ); + } +} diff --git a/src/main/java/org/mastodon/views/grapher/display/DataDisplayFrame.java b/src/main/java/org/mastodon/views/grapher/display/DataDisplayFrame.java index 1b0882692..c3c17079d 100644 --- a/src/main/java/org/mastodon/views/grapher/display/DataDisplayFrame.java +++ b/src/main/java/org/mastodon/views/grapher/display/DataDisplayFrame.java @@ -28,6 +28,8 @@ */ package org.mastodon.views.grapher.display; +import static org.mastodon.app.MastodonIcons.FEATURES_ICON; + import java.awt.BorderLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; @@ -162,6 +164,7 @@ public void windowClosing( final WindowEvent e ) mouseAndKeyHandler.setKeypressManager( optional.values.getKeyPressedManager(), dataDisplayPanel.getDisplay() ); dataDisplayPanel.getDisplay().addHandler( mouseAndKeyHandler ); setLocation( optional.values.getX(), optional.values.getY() ); + setIconImages( FEATURES_ICON ); } public DataDisplayPanel< V, E > getDataDisplayPanel() From 192174fce340e6b8d7732f264e0fee09618f27bc Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Sat, 19 Aug 2023 10:32:22 +0200 Subject: [PATCH 038/220] Move mamut view classes in the respective views subpackages. --- .../org/mastodon/mamut/WindowManager.java | 8 +++++ .../mamut/io/MamutViewStateSerialization.java | 32 +++++++++---------- .../mamut/views/AbstractMamutViewFactory.java | 16 +++++----- .../mamut/{ => views}/MamutBranchView.java | 14 ++++++-- .../mastodon/mamut/{ => views}/MamutView.java | 14 ++++++-- .../{ => views/bdv}/MamutBranchViewBdv.java | 6 +++- .../views/bdv/MamutBranchViewBdvFactory.java | 1 - .../mamut/{ => views/bdv}/MamutViewBdv.java | 7 +++- .../mamut/views/bdv/MamutViewBdvFactory.java | 1 - .../{ => views/grapher}/MamutViewGrapher.java | 7 +++- .../grapher/MamutViewGrapherFactory.java | 1 - .../table}/MamutViewSelectionTable.java | 4 ++- .../table/MamutViewSelectionTableFactory.java | 2 -- .../{ => views/table}/MamutViewTable.java | 7 +++- .../views/table/MamutViewTableFactory.java | 3 +- .../MamutBranchViewTrackScheme.java | 8 ++++- .../MamutBranchViewTrackSchemeFactory.java | 1 - .../MamutBranchViewTrackSchemeHierarchy.java | 3 +- ...BranchViewTrackSchemeHierarchyFactory.java | 1 - .../trackscheme}/MamutViewTrackScheme.java | 8 ++++- .../MamutViewTrackSchemeFactory.java | 1 - 21 files changed, 99 insertions(+), 46 deletions(-) rename src/main/java/org/mastodon/mamut/{ => views}/MamutBranchView.java (97%) rename src/main/java/org/mastodon/mamut/{ => views}/MamutView.java (97%) rename src/main/java/org/mastodon/mamut/{ => views/bdv}/MamutBranchViewBdv.java (98%) rename src/main/java/org/mastodon/mamut/{ => views/bdv}/MamutViewBdv.java (98%) rename src/main/java/org/mastodon/mamut/{ => views/grapher}/MamutViewGrapher.java (97%) rename src/main/java/org/mastodon/mamut/{ => views/table}/MamutViewSelectionTable.java (67%) rename src/main/java/org/mastodon/mamut/{ => views/table}/MamutViewTable.java (98%) rename src/main/java/org/mastodon/mamut/{ => views/trackscheme}/MamutBranchViewTrackScheme.java (97%) rename src/main/java/org/mastodon/mamut/{ => views/trackscheme}/MamutBranchViewTrackSchemeHierarchy.java (98%) rename src/main/java/org/mastodon/mamut/{ => views/trackscheme}/MamutViewTrackScheme.java (97%) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 3c4fd4fa9..b88a147ec 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -54,15 +54,23 @@ import org.mastodon.mamut.feature.MamutFeatureProjectionsManager; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; +import org.mastodon.mamut.views.MamutView; import org.mastodon.mamut.views.MamutViewFactory; import org.mastodon.mamut.views.MamutViewI; +import org.mastodon.mamut.views.bdv.MamutBranchViewBdv; import org.mastodon.mamut.views.bdv.MamutBranchViewBdvFactory; +import org.mastodon.mamut.views.bdv.MamutViewBdv; import org.mastodon.mamut.views.bdv.MamutViewBdvFactory; +import org.mastodon.mamut.views.grapher.MamutViewGrapher; import org.mastodon.mamut.views.grapher.MamutViewGrapherFactory; import org.mastodon.mamut.views.table.MamutViewSelectionTableFactory; +import org.mastodon.mamut.views.table.MamutViewTable; import org.mastodon.mamut.views.table.MamutViewTableFactory; +import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackScheme; import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeFactory; +import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeHierarchy; import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeHierarchyFactory; +import org.mastodon.mamut.views.trackscheme.MamutViewTrackScheme; import org.mastodon.mamut.views.trackscheme.MamutViewTrackSchemeFactory; import org.mastodon.model.tag.ui.TagSetDialog; import org.mastodon.ui.coloring.ColorBarOverlay.Position; diff --git a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java index 298f2e2d0..17941b9e1 100644 --- a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java +++ b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java @@ -28,15 +28,15 @@ */ package org.mastodon.mamut.io; -import static org.mastodon.mamut.MamutBranchView.BRANCH_GRAPH; -import static org.mastodon.mamut.MamutView.COLORBAR_POSITION_KEY; -import static org.mastodon.mamut.MamutView.COLORBAR_VISIBLE_KEY; -import static org.mastodon.mamut.MamutView.FEATURE_COLOR_MODE_KEY; -import static org.mastodon.mamut.MamutView.FRAME_POSITION_KEY; -import static org.mastodon.mamut.MamutView.GROUP_HANDLE_ID_KEY; -import static org.mastodon.mamut.MamutView.NO_COLORING_KEY; -import static org.mastodon.mamut.MamutView.SETTINGS_PANEL_VISIBLE_KEY; -import static org.mastodon.mamut.MamutView.TAG_SET_KEY; +import static org.mastodon.mamut.views.MamutBranchView.BRANCH_GRAPH; +import static org.mastodon.mamut.views.MamutView.COLORBAR_POSITION_KEY; +import static org.mastodon.mamut.views.MamutView.COLORBAR_VISIBLE_KEY; +import static org.mastodon.mamut.views.MamutView.FEATURE_COLOR_MODE_KEY; +import static org.mastodon.mamut.views.MamutView.FRAME_POSITION_KEY; +import static org.mastodon.mamut.views.MamutView.GROUP_HANDLE_ID_KEY; +import static org.mastodon.mamut.views.MamutView.NO_COLORING_KEY; +import static org.mastodon.mamut.views.MamutView.SETTINGS_PANEL_VISIBLE_KEY; +import static org.mastodon.mamut.views.MamutView.TAG_SET_KEY; import static org.mastodon.mamut.views.grapher.MamutViewGrapherFactory.GRAPHER_TRANSFORM_KEY; import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_DISPLAYED; import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_ELEMENT; @@ -58,19 +58,19 @@ import javax.swing.JViewport; import org.jdom2.Element; -import org.mastodon.mamut.MamutBranchViewBdv; -import org.mastodon.mamut.MamutBranchViewTrackScheme; -import org.mastodon.mamut.MamutView; -import org.mastodon.mamut.MamutViewBdv; -import org.mastodon.mamut.MamutViewGrapher; -import org.mastodon.mamut.MamutViewTable; -import org.mastodon.mamut.MamutViewTrackScheme; import org.mastodon.mamut.WindowManager; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Spot; import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; +import org.mastodon.mamut.views.MamutView; import org.mastodon.mamut.views.MamutViewI; +import org.mastodon.mamut.views.bdv.MamutBranchViewBdv; +import org.mastodon.mamut.views.bdv.MamutViewBdv; +import org.mastodon.mamut.views.grapher.MamutViewGrapher; +import org.mastodon.mamut.views.table.MamutViewTable; +import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackScheme; +import org.mastodon.mamut.views.trackscheme.MamutViewTrackScheme; import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.ColoringModel; diff --git a/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java b/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java index 6a8e33f3c..cd3bb2f26 100644 --- a/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java +++ b/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java @@ -1,13 +1,13 @@ package org.mastodon.mamut.views; -import static org.mastodon.mamut.MamutView.COLORBAR_POSITION_KEY; -import static org.mastodon.mamut.MamutView.COLORBAR_VISIBLE_KEY; -import static org.mastodon.mamut.MamutView.FEATURE_COLOR_MODE_KEY; -import static org.mastodon.mamut.MamutView.FRAME_POSITION_KEY; -import static org.mastodon.mamut.MamutView.GROUP_HANDLE_ID_KEY; -import static org.mastodon.mamut.MamutView.NO_COLORING_KEY; -import static org.mastodon.mamut.MamutView.SETTINGS_PANEL_VISIBLE_KEY; -import static org.mastodon.mamut.MamutView.TAG_SET_KEY; +import static org.mastodon.mamut.views.MamutView.COLORBAR_POSITION_KEY; +import static org.mastodon.mamut.views.MamutView.COLORBAR_VISIBLE_KEY; +import static org.mastodon.mamut.views.MamutView.FEATURE_COLOR_MODE_KEY; +import static org.mastodon.mamut.views.MamutView.FRAME_POSITION_KEY; +import static org.mastodon.mamut.views.MamutView.GROUP_HANDLE_ID_KEY; +import static org.mastodon.mamut.views.MamutView.NO_COLORING_KEY; +import static org.mastodon.mamut.views.MamutView.SETTINGS_PANEL_VISIBLE_KEY; +import static org.mastodon.mamut.views.MamutView.TAG_SET_KEY; import java.awt.Rectangle; import java.awt.Window; diff --git a/src/main/java/org/mastodon/mamut/MamutBranchView.java b/src/main/java/org/mastodon/mamut/views/MamutBranchView.java similarity index 97% rename from src/main/java/org/mastodon/mamut/MamutBranchView.java rename to src/main/java/org/mastodon/mamut/views/MamutBranchView.java index 35788f9c3..1fa09a08f 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchView.java +++ b/src/main/java/org/mastodon/mamut/views/MamutBranchView.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut; +package org.mastodon.mamut.views; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; @@ -50,6 +50,7 @@ import org.mastodon.graph.Edge; import org.mastodon.graph.Vertex; import org.mastodon.grouping.GroupHandle; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelGraph; @@ -57,7 +58,6 @@ import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; import org.mastodon.mamut.model.branch.ModelBranchGraph; -import org.mastodon.mamut.views.MamutViewI; import org.mastodon.model.FocusModel; import org.mastodon.model.HighlightModel; import org.mastodon.model.NavigationHandler; @@ -86,6 +86,16 @@ import org.scijava.ui.behaviour.util.WrappedActionMap; import org.scijava.ui.behaviour.util.WrappedInputMap; +/** + * Mother class for views that display the branch graph of the model. + * + * @param + * the type of the branch view graph. + * @param + * the type of vertices in the view graph. + * @param + * the type of edges in the view graph. + */ public class MamutBranchView< VG extends ViewGraph< BranchSpot, BranchLink, V, E >, V extends Vertex< E >, diff --git a/src/main/java/org/mastodon/mamut/MamutView.java b/src/main/java/org/mastodon/mamut/views/MamutView.java similarity index 97% rename from src/main/java/org/mastodon/mamut/MamutView.java rename to src/main/java/org/mastodon/mamut/views/MamutView.java index 65de132ca..b4389eec9 100644 --- a/src/main/java/org/mastodon/mamut/MamutView.java +++ b/src/main/java/org/mastodon/mamut/views/MamutView.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut; +package org.mastodon.mamut.views; import java.awt.Window; import java.util.ArrayList; @@ -46,13 +46,13 @@ import org.mastodon.graph.Edge; import org.mastodon.graph.Vertex; import org.mastodon.grouping.GroupHandle; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; import org.mastodon.mamut.model.branch.ModelBranchGraph; -import org.mastodon.mamut.views.MamutViewI; import org.mastodon.model.SelectionModel; import org.mastodon.model.tag.TagSetModel; import org.mastodon.model.tag.TagSetStructure.TagSet; @@ -67,6 +67,16 @@ import org.mastodon.ui.coloring.feature.FeatureColorMode; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; +/** + * Mother class for views that display the core graph. + * + * @param + * the type of the view graph used in this view. + * @param + * the type of vertices in the view graph. + * @param + * the type of edges in the view graph. + */ public class MamutView< VG extends ViewGraph< Spot, Link, V, E >, V extends Vertex< E >, E extends Edge< V > > extends MastodonFrameView< ProjectModel, VG, Spot, Link, V, E > implements MamutViewI diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdv.java similarity index 98% rename from src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java rename to src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdv.java index 09d716cfb..b0cf43d0e 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewBdv.java +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdv.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut; +package org.mastodon.mamut.views.bdv; import static org.mastodon.app.MastodonIcons.BDV_VIEW_ICON; import static org.mastodon.app.ui.ViewMenuBuilder.item; @@ -46,6 +46,9 @@ import org.mastodon.app.ui.ViewMenu; import org.mastodon.app.ui.ViewMenuBuilder.JMenuHandle; import org.mastodon.graph.GraphIdBimap; +import org.mastodon.mamut.MainWindow; +import org.mastodon.mamut.MamutMenuBuilder; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.model.BoundingSphereRadiusStatistics; import org.mastodon.mamut.model.BranchGraphModelOverlayProperties; import org.mastodon.mamut.model.Link; @@ -55,6 +58,7 @@ import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; import org.mastodon.mamut.model.branch.ModelBranchGraph; +import org.mastodon.mamut.views.MamutBranchView; import org.mastodon.model.NavigationHandler; import org.mastodon.ui.FocusActions; import org.mastodon.ui.HighlightBehaviours; diff --git a/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdvFactory.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdvFactory.java index ee72cf7ba..f8d135d7c 100644 --- a/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdvFactory.java +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdvFactory.java @@ -2,7 +2,6 @@ import java.util.Map; -import org.mastodon.mamut.MamutBranchViewBdv; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; import org.mastodon.mamut.views.MamutViewFactory; diff --git a/src/main/java/org/mastodon/mamut/MamutViewBdv.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdv.java similarity index 98% rename from src/main/java/org/mastodon/mamut/MamutViewBdv.java rename to src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdv.java index fb0122211..38709cb0b 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewBdv.java +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdv.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut; +package org.mastodon.mamut.views.bdv; import static org.mastodon.app.MastodonIcons.BDV_VIEW_ICON; import static org.mastodon.app.ui.ViewMenuBuilder.item; @@ -45,6 +45,10 @@ import org.mastodon.app.ui.SearchVertexLabel; import org.mastodon.app.ui.ViewMenu; import org.mastodon.app.ui.ViewMenuBuilder.JMenuHandle; +import org.mastodon.mamut.MainWindow; +import org.mastodon.mamut.MamutMenuBuilder; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.UndoActions; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelGraph; @@ -52,6 +56,7 @@ import org.mastodon.mamut.model.Spot; import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; +import org.mastodon.mamut.views.MamutView; import org.mastodon.model.AutoNavigateFocusModel; import org.mastodon.model.FocusModel; import org.mastodon.model.HighlightModel; diff --git a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java index 78a3802cc..4278a6e7b 100644 --- a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java @@ -3,7 +3,6 @@ import java.util.Map; import org.jdom2.Element; -import org.mastodon.mamut.MamutViewBdv; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; import org.mastodon.mamut.views.MamutViewFactory; diff --git a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java b/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapher.java similarity index 97% rename from src/main/java/org/mastodon/mamut/MamutViewGrapher.java rename to src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapher.java index 3881db5c5..6d69a89d1 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewGrapher.java +++ b/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapher.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut; +package org.mastodon.mamut.views.grapher; import static org.mastodon.app.ui.ViewMenuBuilder.item; import static org.mastodon.app.ui.ViewMenuBuilder.separator; @@ -43,6 +43,10 @@ import org.mastodon.app.ui.SearchVertexLabel; import org.mastodon.app.ui.ViewMenu; import org.mastodon.app.ui.ViewMenuBuilder.JMenuHandle; +import org.mastodon.mamut.MainWindow; +import org.mastodon.mamut.MamutMenuBuilder; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.UndoActions; import org.mastodon.mamut.feature.SpotFrameFeature; import org.mastodon.mamut.feature.SpotQuickMeanIntensityFeature; import org.mastodon.mamut.model.Link; @@ -50,6 +54,7 @@ import org.mastodon.mamut.model.Spot; import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; +import org.mastodon.mamut.views.MamutView; import org.mastodon.model.AutoNavigateFocusModel; import org.mastodon.ui.EditTagActions; import org.mastodon.ui.FocusActions; diff --git a/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java b/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java index 1c90e5b58..2df7fe4bb 100644 --- a/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java +++ b/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java @@ -2,7 +2,6 @@ import java.util.Map; -import org.mastodon.mamut.MamutViewGrapher; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; import org.mastodon.mamut.views.MamutViewFactory; diff --git a/src/main/java/org/mastodon/mamut/MamutViewSelectionTable.java b/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTable.java similarity index 67% rename from src/main/java/org/mastodon/mamut/MamutViewSelectionTable.java rename to src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTable.java index 28ec8cae7..4cb0c459c 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewSelectionTable.java +++ b/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTable.java @@ -1,4 +1,6 @@ -package org.mastodon.mamut; +package org.mastodon.mamut.views.table; + +import org.mastodon.mamut.ProjectModel; public class MamutViewSelectionTable extends MamutViewTable { diff --git a/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java b/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java index 9394bd45a..2fe8f04da 100644 --- a/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java +++ b/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java @@ -1,7 +1,5 @@ package org.mastodon.mamut.views.table; -import org.mastodon.mamut.MamutViewSelectionTable; -import org.mastodon.mamut.MamutViewTable; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.MamutViewFactory; import org.scijava.plugin.Plugin; diff --git a/src/main/java/org/mastodon/mamut/MamutViewTable.java b/src/main/java/org/mastodon/mamut/views/table/MamutViewTable.java similarity index 98% rename from src/main/java/org/mastodon/mamut/MamutViewTable.java rename to src/main/java/org/mastodon/mamut/views/table/MamutViewTable.java index 9f0e8158f..967e39666 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTable.java +++ b/src/main/java/org/mastodon/mamut/views/table/MamutViewTable.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut; +package org.mastodon.mamut.views.table; import static org.mastodon.app.MastodonIcons.TABLE_VIEW_ICON; import static org.mastodon.app.ui.ViewMenuBuilder.item; @@ -50,6 +50,10 @@ import org.mastodon.app.ui.ViewMenuBuilder; import org.mastodon.app.ui.ViewMenuBuilder.JMenuHandle; import org.mastodon.feature.FeatureModel; +import org.mastodon.mamut.MainWindow; +import org.mastodon.mamut.MamutMenuBuilder; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.UndoActions; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelGraph; @@ -58,6 +62,7 @@ import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; import org.mastodon.mamut.model.branch.ModelBranchGraph; +import org.mastodon.mamut.views.MamutView; import org.mastodon.model.FocusModel; import org.mastodon.model.HighlightModel; import org.mastodon.model.NavigationHandler; diff --git a/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java b/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java index ec2438547..55e025a82 100644 --- a/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java +++ b/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java @@ -1,6 +1,6 @@ package org.mastodon.mamut.views.table; -import static org.mastodon.mamut.MamutBranchView.BRANCH_GRAPH; +import static org.mastodon.mamut.views.MamutBranchView.BRANCH_GRAPH; import java.awt.Point; import java.util.ArrayList; @@ -12,7 +12,6 @@ import javax.swing.JViewport; -import org.mastodon.mamut.MamutViewTable; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; import org.mastodon.mamut.views.MamutViewFactory; diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java similarity index 97% rename from src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java rename to src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java index 6dd740a24..3735c21e3 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut; +package org.mastodon.mamut.views.trackscheme; import static org.mastodon.app.ui.ViewMenuBuilder.item; import static org.mastodon.app.ui.ViewMenuBuilder.separator; @@ -49,10 +49,16 @@ import org.mastodon.app.ui.ViewMenu; import org.mastodon.app.ui.ViewMenuBuilder.JMenuHandle; import org.mastodon.graph.GraphIdBimap; +import org.mastodon.mamut.BranchGraphUndoActions; +import org.mastodon.mamut.MainWindow; +import org.mastodon.mamut.MamutMenuBuilder; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.TimepointAndNumberOfSpotsPanel; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; import org.mastodon.mamut.model.branch.ModelBranchGraph; +import org.mastodon.mamut.views.MamutBranchView; import org.mastodon.model.AutoNavigateFocusModel; import org.mastodon.model.BranchTrackSchemeRootsModel; import org.mastodon.model.FocusModel; diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeFactory.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeFactory.java index 412ff4a54..7722d370e 100644 --- a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeFactory.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeFactory.java @@ -2,7 +2,6 @@ import java.util.Map; -import org.mastodon.mamut.MamutBranchViewTrackScheme; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; diff --git a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackSchemeHierarchy.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchy.java similarity index 98% rename from src/main/java/org/mastodon/mamut/MamutBranchViewTrackSchemeHierarchy.java rename to src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchy.java index 0f8d40ec5..d71f1d507 100644 --- a/src/main/java/org/mastodon/mamut/MamutBranchViewTrackSchemeHierarchy.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchy.java @@ -26,11 +26,12 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut; +package org.mastodon.mamut.views.trackscheme; import org.mastodon.graph.GraphChangeListener; import org.mastodon.graph.GraphIdBimap; import org.mastodon.graph.algorithm.traversal.InverseDepthFirstIterator; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchyFactory.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchyFactory.java index f31007d5e..1f3e975cb 100644 --- a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchyFactory.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchyFactory.java @@ -2,7 +2,6 @@ import java.util.Map; -import org.mastodon.mamut.MamutBranchViewTrackSchemeHierarchy; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; diff --git a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackScheme.java similarity index 97% rename from src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java rename to src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackScheme.java index 81bb52045..c49167299 100644 --- a/src/main/java/org/mastodon/mamut/MamutViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackScheme.java @@ -26,7 +26,7 @@ * POSSIBILITY OF SUCH DAMAGE. * #L% */ -package org.mastodon.mamut; +package org.mastodon.mamut.views.trackscheme; import static org.mastodon.app.ui.ViewMenuBuilder.item; import static org.mastodon.app.ui.ViewMenuBuilder.separator; @@ -47,12 +47,18 @@ import org.mastodon.app.ui.SearchVertexLabel; import org.mastodon.app.ui.ViewMenu; import org.mastodon.app.ui.ViewMenuBuilder.JMenuHandle; +import org.mastodon.mamut.MainWindow; +import org.mastodon.mamut.MamutMenuBuilder; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.TimepointAndNumberOfSpotsPanel; +import org.mastodon.mamut.UndoActions; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.ModelGraphTrackSchemeProperties; import org.mastodon.mamut.model.Spot; import org.mastodon.mamut.model.branch.BranchLink; import org.mastodon.mamut.model.branch.BranchSpot; +import org.mastodon.mamut.views.MamutView; import org.mastodon.model.AutoNavigateFocusModel; import org.mastodon.model.DefaultRootsModel; import org.mastodon.model.RootsModel; diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackSchemeFactory.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackSchemeFactory.java index d48f8a29e..19231098e 100644 --- a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackSchemeFactory.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackSchemeFactory.java @@ -2,7 +2,6 @@ import java.util.Map; -import org.mastodon.mamut.MamutViewTrackScheme; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; import org.mastodon.views.trackscheme.ScreenTransform; From 9c660bec862b2e7b9685512692e7a07c3647d5f8 Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Sun, 20 Aug 2023 17:45:42 +0200 Subject: [PATCH 039/220] Use the new view factories everywhere in Mastodon. The window manager has now a MamutViews that is in charge of detecting and managing a collection of view factories. Each factory is then used by the window manager to make one action that creates a view, registers it in the WM, deals whether it has a context provider or a context chooser, notifies listeners of its creation (see below) and finally shows it. New views are created, registered and managed only via these factories now. Which means that that window manager does not know of any concrete view class. It just manages all the ones it found. This will make it easier to extends Mastodon with new views, without having to touch or even recompile the core. This also makes the window manager class much shorter. There are much less methods and much less fields, since all views are managed in a generic manner. The view factory are also nice because they contain in one place all the info related to an action: command name, menu text, description. For ELEPHANT, Ko requires that there is a view creation listeners list for BDV window. I kept this, but made it generic. There is now one listener list per view type. So you can register a listener for the creation of any type of view, and get it befoore it is shown. The factories also handle GUI state serialization. The ProjectLoader and ProjectSaver class use these factories when loading / saving for restoring / saving the GUI state. There are no specific hard-coded code to handle serialization of GUI state in the io package. Well, not entirely: we still need to know how to convert a Map< String, Object > (which is the GUI state as understood by the views) to a JDom element, which is what the MamutViewStateXMLSerialization does. It just has a series of methods to convert any type or class used in GUI state to a JDom-ready text. This de/serialization also now takes much less code than before, as there were a lot of duplicated code, wich is now present once in the mother abstract class for view factories. Also: the views are now decoupled from saving or restoring the GUI state. The factory does it, which is cleaner. The MainWindow class still needs to know of concrete view types, because we still want to have buttons for the views, and have the nice click and shift-click on them. I think this is ok because normally the rest of the code is *almost* fully decoupled from the MainWindow. There is still one static method addMenus() that is called by the views to create the File menu. This could be moved to the window manager, as it is as generic as the Window menu. This will make it easier also, to create new Mastodon commands or plugins that do now show the MainWindow, but whatever a 3rd party coder wants. --- .../java/org/mastodon/mamut/MainWindow.java | 36 +- .../org/mastodon/mamut/MamutMenuBuilder.java | 9 - .../java/org/mastodon/mamut/MamutViews.java | 123 +++ .../org/mastodon/mamut/WindowManager.java | 658 +++++---------- .../mamut/io/MamutViewStateSerialization.java | 778 ------------------ .../io/MamutViewStateXMLSerialization.java | 398 +++++++++ .../org/mastodon/mamut/io/ProjectLoader.java | 4 +- .../org/mastodon/mamut/io/ProjectSaver.java | 12 +- .../mamut/views/AbstractMamutViewFactory.java | 10 +- .../mamut/views/MamutViewFactory.java | 39 + .../mamut/views/bdv/MamutBranchViewBdv.java | 1 + .../views/bdv/MamutBranchViewBdvFactory.java | 37 +- .../mamut/views/bdv/MamutViewBdv.java | 1 + .../mamut/views/bdv/MamutViewBdvFactory.java | 69 +- .../mamut/views/grapher/MamutViewGrapher.java | 15 +- .../grapher/MamutViewGrapherFactory.java | 69 +- .../table/MamutViewSelectionTableFactory.java | 53 +- .../mamut/views/table/MamutViewTable.java | 1 + .../views/table/MamutViewTableFactory.java | 61 +- .../MamutBranchViewTrackScheme.java | 1 + .../MamutBranchViewTrackSchemeFactory.java | 30 + ...BranchViewTrackSchemeHierarchyFactory.java | 30 + .../trackscheme/MamutViewTrackScheme.java | 1 + .../MamutViewTrackSchemeFactory.java | 60 ++ .../mastodon/mamut/GarbageCollectionTest.java | 29 +- 25 files changed, 1245 insertions(+), 1280 deletions(-) create mode 100644 src/main/java/org/mastodon/mamut/MamutViews.java delete mode 100644 src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java create mode 100644 src/main/java/org/mastodon/mamut/io/MamutViewStateXMLSerialization.java diff --git a/src/main/java/org/mastodon/mamut/MainWindow.java b/src/main/java/org/mastodon/mamut/MainWindow.java index 174f16c8a..2cd948244 100644 --- a/src/main/java/org/mastodon/mamut/MainWindow.java +++ b/src/main/java/org/mastodon/mamut/MainWindow.java @@ -40,7 +40,6 @@ import static org.mastodon.app.ui.ViewMenuBuilder.item; import static org.mastodon.app.ui.ViewMenuBuilder.separator; import static org.mastodon.mamut.MamutMenuBuilder.fileMenu; -import static org.mastodon.mamut.MamutMenuBuilder.windowMenu; import java.awt.BorderLayout; import java.awt.Font; @@ -65,8 +64,16 @@ import org.mastodon.app.MastodonIcons; import org.mastodon.app.ui.ViewMenu; import org.mastodon.mamut.io.ProjectActions; +import org.mastodon.mamut.views.bdv.MamutBranchViewBdvFactory; +import org.mastodon.mamut.views.bdv.MamutViewBdvFactory; +import org.mastodon.mamut.views.grapher.MamutViewGrapherFactory; +import org.mastodon.mamut.views.table.MamutViewSelectionTableFactory; +import org.mastodon.mamut.views.table.MamutViewTableFactory; +import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeFactory; +import org.mastodon.mamut.views.trackscheme.MamutViewTrackSchemeFactory; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.ui.keymap.Keymap; +import org.mastodon.util.RunnableActionPair; import net.miginfocom.swing.MigLayout; @@ -91,7 +98,6 @@ public MainWindow( final ProjectModel appModel ) // Re-register save actions, this time using this frame as parent component. ProjectActions.installAppActions( appModel.getProjectActions(), appModel, this ); - // Views: final JPanel buttonsPanel = new JPanel(); buttonsPanel.setLayout( new MigLayout() ); @@ -101,19 +107,23 @@ public MainWindow( final ProjectModel appModel ) viewsLabel.setFont( buttonsPanel.getFont().deriveFont( Font.BOLD ) ); buttonsPanel.add( viewsLabel, "span, wrap" ); - final JButton tableButton = new JButton( projectActionMap.get( WindowManager.NEW_TABLE_VIEW ) ); + final JButton tableButton = new JButton( projectActionMap.get( MamutViewTableFactory.NEW_TABLE_VIEW ) ); prepareButton( tableButton, "table", TABLE_ICON_MEDIUM ); buttonsPanel.add( tableButton, "grow" ); - final JButton bdvButton = new JButton( projectActionMap.get( WindowManager.NEW_BDV_VIEW ) ); + final JButton bdvButton = new JButton( new RunnableActionPair( MamutViewBdvFactory.NEW_BDV_VIEW, + () -> projectActionMap.get( MamutViewBdvFactory.NEW_BDV_VIEW ).actionPerformed( null ), + () -> projectActionMap.get( MamutBranchViewBdvFactory.NEW_BRANCH_BDV_VIEW ).actionPerformed( null ) ) ); prepareButton( bdvButton, "bdv", BDV_ICON_MEDIUM ); buttonsPanel.add( bdvButton, "grow, wrap" ); - final JButton selectionTableButton = new JButton( projectActionMap.get( WindowManager.NEW_SELECTION_TABLE_VIEW ) ); + final JButton selectionTableButton = new JButton( projectActionMap.get( MamutViewSelectionTableFactory.NEW_SELECTION_TABLE_VIEW ) ); prepareButton( selectionTableButton, "selection table", TABLE_ICON_MEDIUM ); buttonsPanel.add( selectionTableButton, "grow" ); - final JButton trackschemeButton = new JButton( projectActionMap.get( WindowManager.NEW_TRACKSCHEME_VIEW ) ); + final JButton trackschemeButton = new JButton( new RunnableActionPair( MamutViewTrackSchemeFactory.NEW_TRACKSCHEME_VIEW, + () -> projectActionMap.get( MamutViewTrackSchemeFactory.NEW_TRACKSCHEME_VIEW ).actionPerformed( null ), + () -> projectActionMap.get( MamutBranchViewTrackSchemeFactory.NEW_BRANCH_TRACKSCHEME_VIEW ).actionPerformed( null ) ) ); prepareButton( trackschemeButton, "trackscheme", TRACKSCHEME_ICON_MEDIUM ); buttonsPanel.add( trackschemeButton, "grow, wrap" ); @@ -124,7 +134,7 @@ public MainWindow( final ProjectModel appModel ) processingLabel.setFont( buttonsPanel.getFont().deriveFont( Font.BOLD ) ); buttonsPanel.add( processingLabel, "span, wrap" ); - final JButton grapherButton = new JButton( projectActionMap.get( WindowManager.NEW_GRAPHER_VIEW ) ); + final JButton grapherButton = new JButton( projectActionMap.get( MamutViewGrapherFactory.NEW_GRAPHER_VIEW ) ); prepareButton( grapherButton, "grapher", FEATURES_ICON_MEDIUM ); buttonsPanel.add( grapherButton, "grow" ); @@ -179,6 +189,7 @@ public void paintComponent( final Graphics g ) menu = new ViewMenu( menubar, keymap, KeyConfigContexts.MASTODON ); keymap.updateListeners().add( menu::updateKeymap ); addMenus( menu, projectActionMap ); + appModel.getWindowManager().addWindowMenu( menu, projectActionMap ); appModel.getPlugins().addMenus( menu ); setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE ); @@ -273,15 +284,6 @@ public static void addMenus( final ViewMenu menu, final ActionMap actionMap ) // separator(), item( WindowManager.PREFERENCES_DIALOG ), separator(), - item( WindowManager.OPEN_ONLINE_DOCUMENTATION ) ), - windowMenu( - item( WindowManager.NEW_BDV_VIEW ), - item( WindowManager.NEW_TRACKSCHEME_VIEW ), - item( WindowManager.NEW_TABLE_VIEW ), - item( WindowManager.NEW_SELECTION_TABLE_VIEW ), - item( WindowManager.NEW_GRAPHER_VIEW ), - item( WindowManager.NEW_BRANCH_BDV_VIEW ), - item( WindowManager.NEW_BRANCH_TRACKSCHEME_VIEW ), - item( WindowManager.NEW_HIERARCHY_TRACKSCHEME_VIEW ) ) ); + item( WindowManager.OPEN_ONLINE_DOCUMENTATION ) ) ); } } diff --git a/src/main/java/org/mastodon/mamut/MamutMenuBuilder.java b/src/main/java/org/mastodon/mamut/MamutMenuBuilder.java index 4058cb716..850c630a3 100644 --- a/src/main/java/org/mastodon/mamut/MamutMenuBuilder.java +++ b/src/main/java/org/mastodon/mamut/MamutMenuBuilder.java @@ -65,15 +65,6 @@ public class MamutMenuBuilder extends ViewMenuBuilder menuTexts.put( ProjectActions.EXPORT_MAMUT, "Export MaMuT project" ); menuTexts.put( WindowManager.OPEN_ONLINE_DOCUMENTATION, "Open online documentation" ); - - menuTexts.put( WindowManager.NEW_BDV_VIEW, "New Bdv" ); - menuTexts.put( WindowManager.NEW_TRACKSCHEME_VIEW, "New TrackScheme" ); - menuTexts.put( WindowManager.NEW_TABLE_VIEW, "New Data table" ); - menuTexts.put( WindowManager.NEW_SELECTION_TABLE_VIEW, "New Selection table" ); - menuTexts.put( WindowManager.NEW_GRAPHER_VIEW, "New Grapher" ); - menuTexts.put( WindowManager.NEW_BRANCH_BDV_VIEW, "New Bdv Branch" ); - menuTexts.put( WindowManager.NEW_BRANCH_TRACKSCHEME_VIEW, "New TrackScheme Branch" ); - menuTexts.put( WindowManager.NEW_HIERARCHY_TRACKSCHEME_VIEW, "New TrackScheme Hierarchy" ); menuTexts.put( WindowManager.PREFERENCES_DIALOG, "Preferences..." ); menuTexts.put( MastodonFrameViewActions.TOGGLE_SETTINGS_PANEL, "Settings Toolbar" ); diff --git a/src/main/java/org/mastodon/mamut/MamutViews.java b/src/main/java/org/mastodon/mamut/MamutViews.java new file mode 100644 index 000000000..8cae30dca --- /dev/null +++ b/src/main/java/org/mastodon/mamut/MamutViews.java @@ -0,0 +1,123 @@ +/*- + * #%L + * Mastodon + * %% + * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ +package org.mastodon.mamut; + +import static org.mastodon.mamut.MamutMenuBuilder.windowMenu; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.ActionMap; + +import org.mastodon.app.ui.ViewMenu; +import org.mastodon.app.ui.ViewMenuBuilder; +import org.mastodon.app.ui.ViewMenuBuilder.MenuItem; +import org.mastodon.mamut.views.MamutViewFactory; +import org.mastodon.mamut.views.MamutViewI; +import org.mastodon.ui.keymap.CommandDescriptionProvider; +import org.mastodon.ui.keymap.CommandDescriptions; +import org.mastodon.ui.keymap.KeyConfigContexts; + +/** + * Manages a collection of view factories. + *

    + * Collect and install actions, menu items, menu texts. + */ +public class MamutViews +{ + private final Map< Class< ? extends MamutViewI >, MamutViewFactory< ? extends MamutViewI > > factories = new HashMap<>(); + + private final ArrayList< MenuItem > menuItems; + + private final HashMap< String, String > menuTexts; + + MamutViews() + { + menuItems = new ArrayList<>(); + menuTexts = new HashMap<>(); + } + + synchronized void register( final MamutViewFactory< ? extends MamutViewI > factory, final ProjectModel projectModel ) + { + if ( !factories.containsValue( factory ) ) + { + factories.put( factory.getViewClass(), factory ); + menuItems.add( ViewMenuBuilder.item( factory.getCommandName() ) ); + menuTexts.put( factory.getCommandName(), factory.getCommandMenuText() ); + } + } + + /** + * Returns the collection of view classes for which we have a factory. + * + * @return the collection of view classes. + */ + public Collection< Class< ? extends MamutViewI > > getKeys() + { + return Collections.unmodifiableCollection( factories.keySet() ); + } + + /** + * Returns a factory for the specified view class. + * + * @param + * the type of view. + * @param klass + * the class of the view. + * @return a view factory, or null if the specified class is + * unknown. + */ + @SuppressWarnings( "unchecked" ) + public < T extends MamutViewI > MamutViewFactory< T > getFactory( final Class< T > klass ) + { + return ( MamutViewFactory< T > ) factories.get( klass ); + } + + CommandDescriptionProvider getCommandDescriptions() + { + return new CommandDescriptionProvider( KeyConfigContexts.MASTODON ) + { + + @Override + public void getCommandDescriptions( final CommandDescriptions descriptions ) + { + for ( final MamutViewFactory< ? extends MamutViewI > factory : factories.values() ) + descriptions.add( factory.getCommandName(), factory.getCommandKeys(), factory.getCommandDescription() ); + } + }; + } + + void addWindowMenuTo( final ViewMenu menu, final ActionMap actionMap ) + { + MamutMenuBuilder.build( menu, actionMap, menuTexts, windowMenu( menuItems.toArray( new MenuItem[ 0 ] ) ) ); + } +} diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index b88a147ec..5d78152f4 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -47,33 +47,19 @@ import java.util.Optional; import java.util.function.Consumer; +import javax.swing.ActionMap; import javax.swing.JDialog; +import org.mastodon.app.ui.ViewMenu; import org.mastodon.feature.FeatureSpecsService; import org.mastodon.feature.ui.FeatureColorModeConfigPage; import org.mastodon.mamut.feature.MamutFeatureProjectionsManager; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.views.MamutView; import org.mastodon.mamut.views.MamutViewFactory; import org.mastodon.mamut.views.MamutViewI; -import org.mastodon.mamut.views.bdv.MamutBranchViewBdv; -import org.mastodon.mamut.views.bdv.MamutBranchViewBdvFactory; import org.mastodon.mamut.views.bdv.MamutViewBdv; -import org.mastodon.mamut.views.bdv.MamutViewBdvFactory; -import org.mastodon.mamut.views.grapher.MamutViewGrapher; -import org.mastodon.mamut.views.grapher.MamutViewGrapherFactory; -import org.mastodon.mamut.views.table.MamutViewSelectionTableFactory; -import org.mastodon.mamut.views.table.MamutViewTable; -import org.mastodon.mamut.views.table.MamutViewTableFactory; -import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackScheme; -import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeFactory; -import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeHierarchy; -import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeHierarchyFactory; -import org.mastodon.mamut.views.trackscheme.MamutViewTrackScheme; -import org.mastodon.mamut.views.trackscheme.MamutViewTrackSchemeFactory; import org.mastodon.model.tag.ui.TagSetDialog; -import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; import org.mastodon.ui.keymap.CommandDescriptionProvider; import org.mastodon.ui.keymap.CommandDescriptions; @@ -82,26 +68,27 @@ import org.mastodon.ui.keymap.Keymap; import org.mastodon.ui.keymap.KeymapManager; import org.mastodon.ui.keymap.KeymapSettingsPage; -import org.mastodon.util.RunnableActionPair; import org.mastodon.util.ToggleDialogAction; import org.mastodon.views.bdv.overlay.ui.RenderSettingsConfigPage; import org.mastodon.views.bdv.overlay.ui.RenderSettingsManager; +import org.mastodon.views.context.ContextChooser; import org.mastodon.views.context.ContextProvider; import org.mastodon.views.context.HasContextChooser; +import org.mastodon.views.context.HasContextProvider; import org.mastodon.views.grapher.display.style.DataDisplayStyleManager; import org.mastodon.views.grapher.display.style.DataDisplayStyleSettingsPage; -import org.mastodon.views.trackscheme.ScreenTransform; import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleManager; import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleSettingsPage; import org.scijava.Context; +import org.scijava.InstantiableException; import org.scijava.listeners.Listeners; import org.scijava.plugin.Plugin; +import org.scijava.plugin.PluginInfo; +import org.scijava.plugin.PluginService; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.RunnableAction; import bdv.util.InvokeOnEDT; -import bdv.viewer.ViewerPanel; -import net.imglib2.realtransform.AffineTransform3D; /** * Main GUI class for the Mastodon Mamut application. @@ -118,31 +105,18 @@ public class WindowManager { - public static final String NEW_BDV_VIEW = "new bdv view"; - public static final String NEW_TRACKSCHEME_VIEW = "new trackscheme view"; - public static final String NEW_TABLE_VIEW = "new full table view"; - public static final String NEW_SELECTION_TABLE_VIEW = "new selection table view"; - public static final String NEW_GRAPHER_VIEW = "new grapher view"; public static final String PREFERENCES_DIALOG = "Preferences"; public static final String TAGSETS_DIALOG = "edit tag sets"; public static final String COMPUTE_FEATURE_DIALOG = "compute features"; public static final String OPEN_ONLINE_DOCUMENTATION = "open online documentation"; - static final String[] NEW_BDV_VIEW_KEYS = new String[] { "not mapped" }; - static final String[] NEW_TRACKSCHEME_VIEW_KEYS = new String[] { "not mapped" }; static final String[] NEW_TABLE_VIEW_KEYS = new String[] { "not mapped" }; static final String[] NEW_SELECTION_TABLE_VIEW_KEYS = new String[] { "not mapped" }; - static final String[] NEW_GRAPHER_VIEW_KEYS = new String[] { "not mapped" }; static final String[] PREFERENCES_DIALOG_KEYS = new String[] { "meta COMMA", "ctrl COMMA" }; static final String[] TAGSETS_DIALOG_KEYS = new String[] { "not mapped" }; static final String[] COMPUTE_FEATURE_DIALOG_KEYS = new String[] { "not mapped" }; static final String[] OPEN_ONLINE_DOCUMENTATION_KEYS = new String[] { "not mapped" }; - static final String NEW_BRANCH_BDV_VIEW = "new branch bdv view"; - static final String NEW_BRANCH_TRACKSCHEME_VIEW = "new branch trackscheme view"; - static final String NEW_HIERARCHY_TRACKSCHEME_VIEW = "new hierarchy trackscheme view"; - - static final String[] NEW_BRANCH_BDV_VIEW_KEYS = new String[] { "not mapped" }; static final String[] NEW_BRANCH_TRACKSCHEME_VIEW_KEYS = new String[] { "not mapped" }; static final String[] NEW_HIERARCHY_TRACKSCHEME_VIEW_KEYS = new String[] { "not mapped" }; @@ -159,18 +133,20 @@ public class WindowManager private final Map< Class< ? >, Object > managers = new HashMap<>(); /** Stores the different lists of mamut views currently opened. */ - private final Map< Class< ? extends MamutViewI >, List< MamutViewI > > mamutViews = new HashMap<>(); + private final Map< Class< ? extends MamutViewI >, List< MamutViewI > > openedViews = new HashMap<>(); + + private final Map< Class< ? extends MamutViewI >, Listeners.List< ViewCreatedListener< ? extends MamutViewI > > > creationListeners = new HashMap<>(); private final TagSetDialog tagSetDialog; private final JDialog featureComputationDialog; - private final Listeners.List< BdvViewCreatedListener > bdvViewCreatedListeners; - private final PreferencesDialog settings; private final ProjectModel appModel; + private final MamutViews mamutViews; + /** * Creates a new, empty WindowManager instance using the specified context. * @@ -183,27 +159,13 @@ public WindowManager( final ProjectModel appModel ) this.appModel = appModel; final Context context = appModel.getContext(); final Model model = appModel.getModel(); - - /* - * Create and store window lists. - */ - - @SuppressWarnings( "unchecked" ) - final Class< MamutView< ?, ?, ? > >[] knownMamutViewTypes = new Class[] { - MamutViewBdv.class, - MamutViewTrackScheme.class, - MamutViewTable.class, - MamutViewGrapher.class, - MamutBranchViewBdv.class, - MamutBranchViewTrackScheme.class - }; - for ( final Class< MamutView< ?, ?, ? > > klass : knownMamutViewTypes ) - mamutViews.put( klass, new ArrayList<>() ); + final KeymapManager keymapManager = appModel.getKeymapManager(); + final Keymap keymap = keymapManager.getForwardDefaultKeymap(); + final Actions projectActions = appModel.getProjectActions(); /* * Create and store managers. */ - managers.put( TrackSchemeStyleManager.class, new TrackSchemeStyleManager() ); managers.put( DataDisplayStyleManager.class, new DataDisplayStyleManager() ); managers.put( RenderSettingsManager.class, new RenderSettingsManager() ); @@ -212,46 +174,40 @@ public WindowManager( final ProjectModel appModel ) final MamutFeatureProjectionsManager featureProjectionsManager = new MamutFeatureProjectionsManager( context.getService( FeatureSpecsService.class ), featureColorModeManager ); featureProjectionsManager.setModel( model, appModel.getSharedBdvData().getSources().size() ); managers.put( MamutFeatureProjectionsManager.class, featureProjectionsManager ); - final KeymapManager keymapManager = appModel.getKeymapManager(); - final Keymap keymap = keymapManager.getForwardDefaultKeymap(); - // TODO: still needed? - this.bdvViewCreatedListeners = new Listeners.SynchronizedList<>(); + /* + * Discover and handle view factories + */ + this.mamutViews = discoverViewFactories(); + // Build actions to create these views. + for ( final Class< ? extends MamutViewI > klass : mamutViews.getKeys() ) + { + final MamutViewFactory< ? extends MamutViewI > factory = mamutViews.getFactory( klass ); + final RunnableAction createViewAction = new RunnableAction( factory.getCommandName(), () -> createView( klass ) ); + projectActions.namedAction( createViewAction, factory.getCommandKeys() ); + } + + /* + * Discover and handle command descriptions. + */ final CommandDescriptions descriptions = buildCommandDescriptions(); - final Consumer< Keymap > augmentInputTriggerConfig = - k -> descriptions.augmentInputTriggerConfig( k.getConfig() ); + final Consumer< Keymap > augmentInputTriggerConfig = k -> descriptions.augmentInputTriggerConfig( k.getConfig() ); keymapManager.getUserStyles().forEach( augmentInputTriggerConfig ); keymapManager.getBuiltinStyles().forEach( augmentInputTriggerConfig ); /* - * Actions to create views. + * Actions to create dialogs. */ - - final RunnableActionPair newBdvViewAction = new RunnableActionPair( NEW_BDV_VIEW, this::createBigDataViewer, this::createBranchBigDataViewer ); - final RunnableActionPair newTrackSchemeViewAction = new RunnableActionPair( NEW_TRACKSCHEME_VIEW, this::createTrackScheme, this::createBranchTrackScheme ); - final RunnableAction newTableViewAction = new RunnableAction( NEW_TABLE_VIEW, () -> createTable( false ) ); - final RunnableAction newSelectionTableViewAction = new RunnableAction( NEW_SELECTION_TABLE_VIEW, () -> createTable( true ) ); - final RunnableAction newGrapherViewAction = new RunnableAction( NEW_GRAPHER_VIEW, this::createGrapher ); final RunnableAction editTagSetsAction = new RunnableAction( TAGSETS_DIALOG, this::editTagSets ); final RunnableAction featureComputationAction = new RunnableAction( COMPUTE_FEATURE_DIALOG, this::computeFeatures ); - final RunnableAction newBranchBdvViewAction = new RunnableAction( NEW_BRANCH_BDV_VIEW, this::createBranchBigDataViewer ); - final RunnableAction newBranchTrackSchemeViewAction = new RunnableAction( NEW_BRANCH_TRACKSCHEME_VIEW, this::createBranchTrackScheme ); - final RunnableAction newHierarchyTrackSchemeViewAction = new RunnableAction( NEW_HIERARCHY_TRACKSCHEME_VIEW, this::createHierarchyTrackScheme ); final RunnableAction openOnlineDocumentation = new RunnableAction( OPEN_ONLINE_DOCUMENTATION, this::openOnlineDocumentation ); - - final Actions projectActions = appModel.getProjectActions(); - projectActions.namedAction( newBdvViewAction, NEW_BDV_VIEW_KEYS ); - projectActions.namedAction( newTrackSchemeViewAction, NEW_TRACKSCHEME_VIEW_KEYS ); - projectActions.namedAction( newTableViewAction, NEW_SELECTION_TABLE_VIEW_KEYS ); - projectActions.namedAction( newSelectionTableViewAction, NEW_SELECTION_TABLE_VIEW_KEYS ); - projectActions.namedAction( newGrapherViewAction, NEW_GRAPHER_VIEW_KEYS ); projectActions.namedAction( editTagSetsAction, TAGSETS_DIALOG_KEYS ); projectActions.namedAction( featureComputationAction, COMPUTE_FEATURE_DIALOG_KEYS ); - projectActions.namedAction( newBranchBdvViewAction, NEW_BRANCH_BDV_VIEW_KEYS ); - projectActions.namedAction( newBranchTrackSchemeViewAction, NEW_BRANCH_TRACKSCHEME_VIEW_KEYS ); - projectActions.namedAction( newHierarchyTrackSchemeViewAction, NEW_HIERARCHY_TRACKSCHEME_VIEW_KEYS ); projectActions.namedAction( openOnlineDocumentation, OPEN_ONLINE_DOCUMENTATION_KEYS ); + /* + * Preferences dialog. + */ this.settings = new PreferencesDialog( null, keymap, new String[] { KeyConfigContexts.MASTODON } ); settings.addPage( new TrackSchemeStyleSettingsPage( "TrackScheme Styles", getManager( TrackSchemeStyleManager.class ) ) ); settings.addPage( new RenderSettingsConfigPage( "BDV Render Settings", getManager( RenderSettingsManager.class ) ) ); @@ -260,68 +216,73 @@ public WindowManager( final ProjectModel appModel ) settings.addPage( new FeatureColorModeConfigPage( "Feature Color Modes", featureColorModeManager, featureProjectionsManager, "Spot", "Link" ) ); settings.pack(); - final ToggleDialogAction tooglePreferencesDialogAction = new ToggleDialogAction( PREFERENCES_DIALOG, settings ); projectActions.namedAction( tooglePreferencesDialogAction, PREFERENCES_DIALOG_KEYS ); - tagSetDialog = new TagSetDialog( null, model.getTagSetModel(), model, keymap, - new String[] { KeyConfigContexts.MASTODON } ); + /* + * Tag-set and feature computation dialogs + */ + tagSetDialog = new TagSetDialog( null, model.getTagSetModel(), model, keymap, new String[] { KeyConfigContexts.MASTODON } ); tagSetDialog.setIconImages( TAGS_ICON ); featureComputationDialog = MamutFeatureComputation.getDialog( appModel, context ); featureComputationDialog.setIconImages( FEATURES_ICON ); } /** - * Returns the manager object of the specified class used in this window - * manager, or null if a manager of the specified class does - * not exist. + * Creates, shows, registers and returns a view of the specified class with + * default GUI state. * * @param - * the manager type. + * the view type. * @param klass - * the manager class. - * @return the manager instance or null. + * the view class. + * @return a new instance of the view, that was shown. */ - public < T > T getManager( final Class< T > klass ) + public < T extends MamutViewI > T createView( final Class< T > klass ) { - @SuppressWarnings( "unchecked" ) - final T manager = ( T ) managers.get( klass ); - return manager; + return createView( klass, Collections.emptyMap() ); } /** - * Returns the list of opened mamut views of the specified type, or - * null if a view of this type is not registered. + * Creates, shows, registers and returns a view of the specified class, with + * GUI state read from the specified map. * * @param - * the view type, must extend {@link MamutViewI}. + * the view type. * @param klass - * the view class, must extend {@link MamutViewI}. - * @return the list of view of specified class, or null. + * the view class. + * @param guiState + * the GUI state map. + * @return a new instance of the view, that was shown. */ - private < T extends MamutViewI > List< T > getViewList( final Class< T > klass ) + public < T extends MamutViewI > T createView( final Class< T > klass, final Map< String, Object > guiState ) { - @SuppressWarnings( "unchecked" ) - final List< T > list = ( List< T > ) mamutViews.get( klass ); - return list; - } + // Get the right factory. + final MamutViewFactory< T > factory = mamutViews.getFactory( klass ); - private synchronized void addBdvWindow( final MamutViewBdv w ) - { - getViewList( MamutViewBdv.class ).add( w ); - contextProviders.add( w.getContextProvider() ); - forEachView( v -> { - if ( v instanceof HasContextChooser ) - { - @SuppressWarnings( "unchecked" ) - final HasContextChooser< Spot > cc = ( HasContextChooser< Spot > ) v; - cc.getContextChooser().updateContextProviders( contextProviders ); - } - } ); + // Create the view. + final T view = factory.create( appModel ); + + // Restore the view GUI state. + factory.restoreGuiState( view, guiState ); - w.onClose( () -> { - getViewList( MamutViewBdv.class ).remove( w ); - contextProviders.remove( w.getContextProvider() ); + // Store the view for window manager. + openedViews.computeIfAbsent( klass, ( v ) -> new ArrayList<>() ).add( view ); + + // Does it has a context chooser? + if ( view instanceof HasContextChooser ) + { + @SuppressWarnings( "unchecked" ) + final ContextChooser< Spot > cc = ( ( HasContextChooser< Spot > ) view ).getContextChooser(); + cc.updateContextProviders( contextProviders ); + } + + // Does it has a context provider? + if ( view instanceof HasContextProvider ) + { + final ContextProvider< Spot > cp = ( ( HasContextProvider ) view ).getContextProvider(); + contextProviders.add( cp ); + // Notify context choosers. forEachView( v -> { if ( v instanceof HasContextChooser ) { @@ -330,49 +291,120 @@ private synchronized void addBdvWindow( final MamutViewBdv w ) cc.getContextChooser().updateContextProviders( contextProviders ); } } ); + } + + // Register close listener. + view.onClose( () -> { + // Remove view from list of opened views. + getViewList( klass ).remove( view ); + + if ( view instanceof HasContextChooser ) + { + // Remove context providers from it. + @SuppressWarnings( "unchecked" ) + final ContextChooser< Spot > cc = ( ( HasContextChooser< Spot > ) view ).getContextChooser(); + cc.updateContextProviders( new ArrayList<>() ); + } + + if ( view instanceof HasContextProvider ) + { + // Remove it from the list of context providers. + final ContextProvider< Spot > cp = ( ( HasContextProvider ) view ).getContextProvider(); + contextProviders.remove( cp ); + // Notify context choosers. + forEachView( v -> { + if ( v instanceof HasContextChooser ) + { + @SuppressWarnings( "unchecked" ) + final HasContextChooser< Spot > cc = ( HasContextChooser< Spot > ) v; + cc.getContextChooser().updateContextProviders( contextProviders ); + } + } ); + } } ); - } - private synchronized void addBBdvWindow( final MamutBranchViewBdv w ) - { - getViewList( MamutBranchViewBdv.class ).add( w ); - w.onClose( () -> getViewList( MamutBranchViewBdv.class ).remove( w ) ); + // Notify listeners that it has been created. + @SuppressWarnings( "rawtypes" ) + final Listeners.List l1 = creationListeners.get( klass ); + @SuppressWarnings( "unchecked" ) + final Listeners.List< ViewCreatedListener< T > > list = l1; + if ( list != null ) + list.list.forEach( l -> l.viewCreated( view ) ); + + // Finally, show it. + view.getFrame().setVisible( true ); + return view; } - private synchronized void addTsWindow( final MamutViewTrackScheme w ) + /** + * Adds the create view sub-menu 'Window' to the specified menu, using the specified action-map. + * @param menu the menu to add to. + * @param actionMap the action map of the frame where the menu is. + */ + public void addWindowMenu( final ViewMenu menu, final ActionMap actionMap ) { - getViewList( MamutViewTrackScheme.class ).add( w ); - w.getContextChooser().updateContextProviders( contextProviders ); - w.onClose( () -> { - getViewList( MamutViewTrackScheme.class ).remove( w ); - w.getContextChooser().updateContextProviders( new ArrayList<>() ); - } ); + mamutViews.addWindowMenuTo( menu, actionMap ); } - private synchronized void addBTsWindow( final MamutBranchViewTrackScheme w ) + @SuppressWarnings( { "rawtypes", "unchecked" } ) + private MamutViews discoverViewFactories() { - getViewList( MamutBranchViewTrackScheme.class ).add( w ); - w.onClose( () -> getViewList( MamutBranchViewTrackScheme.class ).remove( w ) ); + final MamutViews mamutViews = new MamutViews(); + final Context context = appModel.getContext(); + if ( context != null ) + { + final PluginService pluginService = context.getService( PluginService.class ); + final List< PluginInfo< MamutViewFactory > > infos = pluginService.getPluginsOfType( MamutViewFactory.class ); + for ( final PluginInfo< MamutViewFactory > info : infos ) + { + try + { + final MamutViewFactory factory = info.createInstance(); + context.inject( factory ); + mamutViews.register( factory, appModel ); + } + catch ( final InstantiableException e ) + { + e.printStackTrace(); + } + } + } + return mamutViews; } - private synchronized void addTableWindow( final MamutViewTable table ) + /** + * Returns the manager object of the specified class used in this window + * manager, or null if a manager of the specified class does + * not exist. + * + * @param + * the manager type. + * @param klass + * the manager class. + * @return the manager instance or null. + */ + public < T > T getManager( final Class< T > klass ) { - getViewList( MamutViewTable.class ).add( table ); - table.getContextChooser().updateContextProviders( contextProviders ); - table.onClose( () -> { - getViewList( MamutViewTable.class ).remove( table ); - table.getContextChooser().updateContextProviders( new ArrayList<>() ); - } ); + @SuppressWarnings( "unchecked" ) + final T manager = ( T ) managers.get( klass ); + return manager; } - private synchronized void addGrapherWindow( final MamutViewGrapher grapher ) + /** + * Returns the list of opened mamut views of the specified type, or + * null if a view of this type is not registered. + * + * @param + * the view type, must extend {@link MamutViewI}. + * @param klass + * the view class, must extend {@link MamutViewI}. + * @return the list of view of specified class, or null. + */ + private < T extends MamutViewI > List< T > getViewList( final Class< T > klass ) { - getViewList( MamutViewGrapher.class ).add( grapher ); - grapher.getContextChooser().updateContextProviders( contextProviders ); - grapher.onClose( () -> { - getViewList( MamutViewGrapher.class ).remove( grapher ); - grapher.getContextChooser().updateContextProviders( new ArrayList<>() ); - } ); + @SuppressWarnings( "unchecked" ) + final List< T > list = ( List< T > ) openedViews.get( klass ); + return list; } /** @@ -399,288 +431,7 @@ public < T extends MamutViewI > void forEachView( final Class< T > klass, final */ public void forEachView( final Consumer< ? super MamutViewI > action ) { - mamutViews.forEach( ( k, l ) -> l.forEach( action ) ); - } - - /** - * Creates and displays a new BDV view, with default display settings. - */ - public MamutViewBdv createBigDataViewer() - { - return createBigDataViewer( new HashMap<>() ); - } - - /** - * Creates and displays a new BDV view, using a map to specify the display - * settings. - *

    - * The display settings are specified as a map of strings to objects. The - * accepted key and value types are: - *

      - *
    • 'FramePosition' → an int[] array of 4 - * elements: x, y, width and height. - *
    • 'LockGroupId' → an integer that specifies the lock - * group id. - *
    • 'SettingsPanelVisible' → a boolean that specifies - * whether the settings panel is visible on this view. - *
    • 'BdvState' → a XML Element that specifies the BDV - * window state. See {@link ViewerPanel#stateToXml()} and - * {@link ViewerPanel#stateFromXml(org.jdom2.Element)} for more information. - *
    • 'BdvTransform' → an {@link AffineTransform3D} that - * specifies the view point. - *
    • 'NoColoring' → a boolean; if true, the - * feature or tag coloring will be ignored. - *
    • 'TagSet' → a string specifying the name of the - * tag-set to use for coloring. If not null, the coloring will - * be done using the tag-set. - *
    • 'FeatureColorMode' → a String specifying the name - * of the feature color mode to use for coloring. If not null, - * the coloring will be done using the feature color mode. - *
    • 'ColorbarVisible' → a boolean specifying whether - * the colorbar is visible for tag-set and feature-based coloring. - *
    • 'ColorbarPosition' → a {@link Position} specifying - * the position of the colorbar. - *
    - * - * @param guiState - * the map of settings. - */ - public MamutViewBdv createBigDataViewer( final Map< String, Object > guiState ) - { - final MamutViewBdv view = new MamutViewBdvFactory().show( appModel, guiState ); - addBdvWindow( view ); - bdvViewCreatedListeners.list.forEach( l -> l.bdvViewCreated( view ) ); - return view; - } - - /** - * Creates and displays a new TrackScheme view, with default display - * settings. - */ - public MamutViewTrackScheme createTrackScheme() - { - return createTrackScheme( new HashMap<>() ); - } - - /** - * Creates and displays a new BDV view, using a map to specify the display - * settings. - *

    - * The display settings are specified as a map of strings to objects. The - * accepted key and value types are: - *

      - *
    • 'FramePosition' → an int[] array of 4 - * elements: x, y, width and height. - *
    • 'LockGroupId' → an integer that specifies the lock - * group id. - *
    • 'SettingsPanelVisible' → a boolean that specifies - * whether the settings panel is visible on this view. - *
    • 'TrackSchemeTransform' → a {@link ScreenTransform} - * that defines the starting view zone in TrackScheme. - *
    • 'NoColoring' → a boolean; if true, the - * feature or tag coloring will be ignored. - *
    • 'TagSet' → a string specifying the name of the - * tag-set to use for coloring. If not null, the coloring will - * be done using the tag-set. - *
    • 'FeatureColorMode' → a @link String specifying the - * name of the feature color mode to use for coloring. If not - * null, the coloring will be done using the feature color - * mode. - *
    • 'ColorbarVisible' → a boolean specifying whether - * the colorbar is visible for tag-set and feature-based coloring. - *
    • 'ColorbarPosition' → a {@link Position} specifying - * the position of the colorbar. - *
    - * - * @param guiState - * the map of settings. - */ - public MamutViewTrackScheme createTrackScheme( final Map< String, Object > guiState ) - { - final MamutViewTrackScheme view = new MamutViewTrackSchemeFactory().show( appModel, guiState ); - addTsWindow( view ); - return view; - } - - /** - * Creates and displays a new Table or a Selection Table view, using a map - * to specify the display settings. - *

    - * The display settings are specified as a map of strings to objects. The - * accepted key and value types are: - *

      - *
    • 'FramePosition' → an int[] array of 4 - * elements: x, y, width and height. - *
    • 'LockGroupId' → an integer that specifies the lock - * group id. - *
    • 'SettingsPanelVisible' → a boolean that specifies - * whether the settings panel is visible on this view. - *
    • 'NoColoring' → a boolean; if true, the - * feature or tag coloring will be ignored. - *
    • 'TagSet' → a string specifying the name of the - * tag-set to use for coloring. If not null, the coloring will - * be done using the tag-set. - *
    • 'FeatureColorMode' → a @link String specifying the - * name of the feature color mode to use for coloring. If not - * null, the coloring will be done using the feature color - * mode. - *
    • 'ColorbarVisible' → a boolean specifying whether - * the colorbar is visible for tag-set and feature-based coloring. - *
    • 'ColorbarPosition' → a {@link Position} specifying - * the position of the colorbar. - *
    - * - * @param guiState - * the map of settings. - */ - public MamutViewTable createTable( final boolean selectionOnly, final Map< String, Object > guiState ) - { - - final MamutViewFactory< ? > factory = selectionOnly - ? new MamutViewSelectionTableFactory() - : new MamutViewTableFactory(); - final MamutViewTable view = ( MamutViewTable ) factory.show( appModel, guiState ); - addTableWindow( view ); - return view; - } - - /** - * Creates and display a new Table or Selection Table view with default - * settings. - * - * @param selectionOnly - * if true, the table will only display the current - * content of the selection, and will listen to its changes. If - * false, the table will display the full graph - * content, listen to its changes, and will be able to edit the - * selection. - * @return a new table view. - */ - public MamutViewTable createTable( final boolean selectionOnly ) - { - return createTable( selectionOnly, Collections.emptyMap() ); - } - - /** - * Creates and displays a new Grapher view, with default display settings. - */ - public MamutViewGrapher createGrapher() - { - return createGrapher( new HashMap<>() ); - } - - /** - * Creates and displays a new Grapher view, using a map to specify the - * display settings. - *

    - * The display settings are specified as a map of strings to objects. The - * accepted key and value types are: - *

      - *
    • 'FramePosition' → an int[] array of 4 - * elements: x, y, width and height. - *
    • 'LockGroupId' → an integer that specifies the lock - * group id. - *
    • 'SettingsPanelVisible' → a boolean that specifies - * whether the settings panel is visible on this view. - *
    • 'NoColoring' → a boolean; if true, the - * feature or tag coloring will be ignored. - *
    • 'TagSet' → a string specifying the name of the - * tag-set to use for coloring. If not null, the coloring will - * be done using the tag-set. - *
    • 'FeatureColorMode' → a @link String specifying the - * name of the feature color mode to use for coloring. If not - * null, the coloring will be done using the feature color - * mode. - *
    • 'ColorbarVisible' → a boolean specifying whether - * the colorbar is visible for tag-set and feature-based coloring. - *
    • 'ColorbarPosition' → a {@link Position} specifying - * the position of the colorbar. - *
    • 'GrapherTransform' → a - * {@link org.mastodon.views.grapher.datagraph.ScreenTransform} specifying - * the region to initially zoom on the XY plot. - * - *
    - * - * @param guiState - * the map of settings. - */ - public MamutViewGrapher createGrapher( final Map< String, Object > guiState ) - { - final MamutViewGrapher view = new MamutViewGrapherFactory().show( appModel, guiState ); - addGrapherWindow( view ); - return view; - } - - /** - * Creates and displays a new Branch-BDV view, with default display - * settings. The branch version of this view displays the branch graph. - */ - public MamutBranchViewBdv createBranchBigDataViewer() - { - return createBranchBigDataViewer( new HashMap<>() ); - } - - /** - * Creates and displays a new Branch-BDV view, using a map to specify the - * display settings. - * - * @see #createBigDataViewer(Map) - * @param guiState - * the settings map. - */ - public MamutBranchViewBdv createBranchBigDataViewer( final Map< String, Object > guiState ) - { - final MamutBranchViewBdv view = new MamutBranchViewBdvFactory().show( appModel, guiState ); - addBBdvWindow( view ); - return view; - } - - /** - * Creates and displays a new Branch-TrackScheme view, with default display - * settings. The branch version of this view displays the branch graph. - */ - public MamutBranchViewTrackScheme createBranchTrackScheme() - { - return createBranchTrackScheme( new HashMap<>() ); - } - - /** - * Creates and displays a new Branch-TrackScheme view, using a map to - * specify the display settings. - * - * @see #createTrackScheme(Map) - * @param guiState - * the settings map. - */ - public MamutBranchViewTrackScheme createBranchTrackScheme( final Map< String, Object > guiState ) - { - final MamutBranchViewTrackScheme view = new MamutBranchViewTrackSchemeFactory().show( appModel, guiState ); - addBTsWindow( view ); - return view; - } - - /** - * Creates and displays a new Hierarchy-TrackScheme view, with default - * display settings. - */ - public MamutBranchViewTrackScheme createHierarchyTrackScheme() - { - return createHierarchyTrackScheme( new HashMap<>() ); - } - - /** - * Creates and displays a new Hierarchy-TrackScheme view, using a map to - * specify the display settings. - * - * @see #createTrackScheme(Map) - * @param guiState - * the settings map. - */ - public MamutBranchViewTrackScheme createHierarchyTrackScheme( final Map< String, Object > guiState ) - { - final MamutBranchViewTrackSchemeHierarchy view = new MamutBranchViewTrackSchemeHierarchyFactory().show( appModel, guiState ); - addBTsWindow( view ); - return view; + openedViews.forEach( ( k, l ) -> l.forEach( action ) ); } /** @@ -753,16 +504,41 @@ public void dispose() settings.dispose(); } + /** + * Exposes the preferences dialog, in which configuration options are + * listed. + * + * @return the preferences dialog. + */ public PreferencesDialog getPreferencesDialog() { return settings; } + /** + * Exposes the collection of view factories used to create views from this + * window manager. + * + * @return the view factories. + */ + public MamutViews getViewFactories() + { + return mamutViews; + } + + /** + * Discovers and build command descriptions. Manually add descriptions for + * the views managed by {@link MamutViews}. + * + * @return the command descriptions object. + */ private CommandDescriptions buildCommandDescriptions() { final CommandDescriptionsBuilder builder = new CommandDescriptionsBuilder(); appModel.getContext().inject( builder ); builder.discoverProviders(); + // Manually declare command descriptions. + builder.addManually( mamutViews.getCommandDescriptions(), KeyConfigContexts.MASTODON ); return builder.build(); } @@ -770,14 +546,16 @@ private CommandDescriptions buildCommandDescriptions() * Classes that implement {@link BdvViewCreatedListener} get a notification * when a new {@link MamutViewBdv} instance is created. */ - public interface BdvViewCreatedListener + public interface ViewCreatedListener< T extends MamutViewI > { - void bdvViewCreated( final MamutViewBdv view ); + void viewCreated( final T view ); } - public Listeners< BdvViewCreatedListener > bdvViewCreatedListeners() + @SuppressWarnings( { "rawtypes", "unchecked" } ) + public < T extends MamutViewI > Listeners.List< ViewCreatedListener< T > > viewCreatedListeners( final Class< T > klass ) { - return bdvViewCreatedListeners; + final Listeners listeners = creationListeners.computeIfAbsent( klass, v -> new Listeners.SynchronizedList<>() ); + return ( Listeners.List< ViewCreatedListener< T > > ) listeners; } /* @@ -794,26 +572,10 @@ public Descriptions() @Override public void getCommandDescriptions( final CommandDescriptions descriptions ) { - descriptions.add( NEW_BDV_VIEW, NEW_BDV_VIEW_KEYS, "Open a new BigDataViewer view." ); - descriptions.add( NEW_TRACKSCHEME_VIEW, NEW_TRACKSCHEME_VIEW_KEYS, "Open a new TrackScheme view." ); - descriptions.add( NEW_TABLE_VIEW, NEW_TABLE_VIEW_KEYS, "Open a new table view. " - + "The table displays the full data." ); - descriptions.add( NEW_SELECTION_TABLE_VIEW, NEW_SELECTION_TABLE_VIEW_KEYS, - "Open a new selection table view. " - + "The table only displays the current selection and " - + "is updated as the selection changes." ); descriptions.add( PREFERENCES_DIALOG, PREFERENCES_DIALOG_KEYS, "Edit Mastodon preferences." ); descriptions.add( TAGSETS_DIALOG, TAGSETS_DIALOG_KEYS, "Edit tag definitions." ); descriptions.add( COMPUTE_FEATURE_DIALOG, COMPUTE_FEATURE_DIALOG_KEYS, "Show the feature computation dialog." ); - descriptions.add( NEW_BRANCH_BDV_VIEW, NEW_BRANCH_BDV_VIEW_KEYS, "Open a new branch BigDataViewer view." ); - descriptions.add( NEW_BRANCH_TRACKSCHEME_VIEW, NEW_BRANCH_TRACKSCHEME_VIEW_KEYS, - "Open a new branch TrackScheme view." ); - descriptions.add( NEW_HIERARCHY_TRACKSCHEME_VIEW, NEW_HIERARCHY_TRACKSCHEME_VIEW_KEYS, - "Open a new hierarchy TrackScheme view." ); - descriptions.add( OPEN_ONLINE_DOCUMENTATION, OPEN_ONLINE_DOCUMENTATION_KEYS, - "Open the online documentation in a web browser." ); - descriptions.add( NEW_GRAPHER_VIEW, NEW_GRAPHER_VIEW_KEYS, "Open a new Grapher view." ); } } } diff --git a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java b/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java deleted file mode 100644 index 17941b9e1..000000000 --- a/src/main/java/org/mastodon/mamut/io/MamutViewStateSerialization.java +++ /dev/null @@ -1,778 +0,0 @@ -/*- - * #%L - * Mastodon - * %% - * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ -package org.mastodon.mamut.io; - -import static org.mastodon.mamut.views.MamutBranchView.BRANCH_GRAPH; -import static org.mastodon.mamut.views.MamutView.COLORBAR_POSITION_KEY; -import static org.mastodon.mamut.views.MamutView.COLORBAR_VISIBLE_KEY; -import static org.mastodon.mamut.views.MamutView.FEATURE_COLOR_MODE_KEY; -import static org.mastodon.mamut.views.MamutView.FRAME_POSITION_KEY; -import static org.mastodon.mamut.views.MamutView.GROUP_HANDLE_ID_KEY; -import static org.mastodon.mamut.views.MamutView.NO_COLORING_KEY; -import static org.mastodon.mamut.views.MamutView.SETTINGS_PANEL_VISIBLE_KEY; -import static org.mastodon.mamut.views.MamutView.TAG_SET_KEY; -import static org.mastodon.mamut.views.grapher.MamutViewGrapherFactory.GRAPHER_TRANSFORM_KEY; -import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_DISPLAYED; -import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_ELEMENT; -import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_NAME; -import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_VISIBLE_POS; -import static org.mastodon.mamut.views.trackscheme.MamutViewTrackSchemeFactory.TRACKSCHEME_TRANSFORM_KEY; - -import java.awt.GraphicsDevice; -import java.awt.GraphicsEnvironment; -import java.awt.Point; -import java.awt.Rectangle; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import javax.swing.JViewport; - -import org.jdom2.Element; -import org.mastodon.mamut.WindowManager; -import org.mastodon.mamut.model.Link; -import org.mastodon.mamut.model.Spot; -import org.mastodon.mamut.model.branch.BranchLink; -import org.mastodon.mamut.model.branch.BranchSpot; -import org.mastodon.mamut.views.MamutView; -import org.mastodon.mamut.views.MamutViewI; -import org.mastodon.mamut.views.bdv.MamutBranchViewBdv; -import org.mastodon.mamut.views.bdv.MamutViewBdv; -import org.mastodon.mamut.views.grapher.MamutViewGrapher; -import org.mastodon.mamut.views.table.MamutViewTable; -import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackScheme; -import org.mastodon.mamut.views.trackscheme.MamutViewTrackScheme; -import org.mastodon.ui.coloring.ColorBarOverlay; -import org.mastodon.ui.coloring.ColorBarOverlay.Position; -import org.mastodon.ui.coloring.ColoringModel; -import org.mastodon.ui.coloring.ColoringModelMain; -import org.mastodon.views.context.ContextChooser; -import org.mastodon.views.context.ContextProvider; -import org.mastodon.views.grapher.display.DataDisplayPanel; -import org.mastodon.views.table.FeatureTagTablePanel; -import org.mastodon.views.trackscheme.ScreenTransform; -import org.mastodon.views.trackscheme.display.TrackSchemePanel; - -import bdv.viewer.ViewerState; -import mpicbg.spim.data.XmlHelpers; -import net.imglib2.realtransform.AffineGet; -import net.imglib2.realtransform.AffineTransform3D; - -/** - * Collection of constants and utilities related to de/serializing a GUI state. - */ -class MamutViewStateSerialization -{ - - /** - * Key for the {@link ViewerState} in a BDV view. Value is a XML - * {@link Element} serialized from the state. - * - * @see ViewerPanelMamut#stateToXml() - * @see ViewerPanelMamut#stateFromXml(Element) - */ - public static final String BDV_STATE_KEY = "BdvState"; - - /** - * Key for the transform in a BDV view. Value is an - * {@link AffineTransform3D} instance. - */ - public static final String BDV_TRANSFORM_KEY = "BdvTransform"; - - static final String WINDOW_TAG = "Window"; - - /** - * Key to the view type name. Value is a string. - */ - static final String VIEW_TYPE_KEY = "Type"; - - /** - * Key that specifies the name of the chosen context provider. Values are - * strings. - */ - static final String CHOSEN_CONTEXT_PROVIDER_KEY = "ContextProvider"; - - /** - * Serializes a GUI state map into a XML element. - * - * @param guiState - * the GUI state to serialize. - * @return a new XML element. - */ - static < V extends MamutViewI > Element toXml( final V view ) - { - final Map< String, Object > guiState = getGuiState( view ); - final Element element = new Element( WINDOW_TAG ); - toXml( guiState, element ); - return element; - } - - static void toXml( final Map< String, Object > map, final Element element ) - { - for ( final Entry< String, Object > entry : map.entrySet() ) - { - final Element el = toXml( entry.getKey(), entry.getValue() ); - element.addContent( el ); - } - } - - @SuppressWarnings( "unchecked" ) - static Element toXml( final String key, final Object value ) - { - final Element el; - if ( value instanceof Integer ) - el = XmlHelpers.intElement( key, ( Integer ) value ); - else if ( value instanceof int[] ) - el = XmlHelpers.intArrayElement( key, ( int[] ) value ); - else if ( value instanceof Double ) - el = XmlHelpers.doubleElement( key, ( Double ) value ); - else if ( value instanceof double[] ) - el = XmlHelpers.doubleArrayElement( key, ( double[] ) value ); - else if ( value instanceof AffineGet ) - el = XmlHelpers.affineTransform3DElement( key, ( AffineGet ) value ); - else if ( value instanceof Boolean ) - el = XmlHelpers.booleanElement( key, ( Boolean ) value ); - else if ( value instanceof String ) - { - el = new Element( key ); - el.setText( value.toString() ); - } - else if ( value instanceof ScreenTransform ) - { - final ScreenTransform t = ( ScreenTransform ) value; - el = XmlHelpers.doubleArrayElement( key, new double[] { - t.getMinX(), - t.getMaxX(), - t.getMinY(), - t.getMaxY(), - t.getScreenWidth(), - t.getScreenHeight() - } ); - } - else if ( value instanceof org.mastodon.views.grapher.datagraph.ScreenTransform ) - { - final org.mastodon.views.grapher.datagraph.ScreenTransform t = - ( org.mastodon.views.grapher.datagraph.ScreenTransform ) value; - el = XmlHelpers.doubleArrayElement( key, new double[] { - t.getMinX(), - t.getMaxX(), - t.getMinY(), - t.getMaxY(), - t.getScreenWidth(), - t.getScreenHeight() - } ); - } - else if ( value instanceof Position ) - { - el = new Element( key ); - el.setText( ( ( Position ) value ).name() ); - } - else if ( value instanceof Element ) - { - el = new Element( key ); - el.setContent( ( Element ) value ); - } - else if ( value instanceof Map ) - { - el = new Element( key ); - toXml( ( Map< String, Object > ) value, el ); - } - else if ( value instanceof List ) - { - el = new Element( key ); - final List< Object > os = ( List< Object > ) value; - for ( final Object o : os ) - { - final Element child = toXml( key, o ); - el.addContent( child ); - } - } - else - { - System.err.println( "Do not know how to serialize object " + value + " for key " + key + "." ); - el = null; - } - return el; - } - - /** - * Wraps GUI state of a {@link MamutView} into a map. - * - * @param view - * the view. - * @return a new {@link Map}. - */ - private static < V extends MamutViewI > Map< String, Object > getGuiState( final V view ) - { - final Map< String, Object > guiState = new LinkedHashMap<>(); - - // View type. - guiState.put( VIEW_TYPE_KEY, view.getClass().getSimpleName() ); - - // Frame position and size. - final Rectangle bounds = view.getFrame().getBounds(); - guiState.put( FRAME_POSITION_KEY, new int[] { - ( int ) bounds.getMinX(), - ( int ) bounds.getMinY(), - ( int ) bounds.getWidth(), - ( int ) bounds.getHeight() } ); - - // Lock groups. - guiState.put( GROUP_HANDLE_ID_KEY, view.getGroupHandle().getGroupId() ); - - // Settings panel visibility. - guiState.put( SETTINGS_PANEL_VISIBLE_KEY, view.getFrame().isSettingsPanelVisible() ); - - // View-specifics. - if ( view instanceof MamutViewBdv ) - getGuiStateBdv( ( MamutViewBdv ) view, guiState ); - else if ( view instanceof MamutBranchViewBdv ) - getGuiStateBranchBdv( ( MamutBranchViewBdv ) view, guiState ); - else if ( view instanceof MamutViewTrackScheme ) - getGuiStateTrackScheme( ( MamutViewTrackScheme ) view, guiState ); - else if ( view instanceof MamutBranchViewTrackScheme ) - getGuiStateBranchTrackScheme( ( MamutBranchViewTrackScheme ) view, guiState ); - else if ( view instanceof MamutViewTable ) - getGuiStateTable( ( MamutViewTable ) view, guiState ); - else if ( view instanceof MamutViewGrapher ) - getGuiStateGrapher( ( MamutViewGrapher ) view, guiState ); - - return guiState; - } - - private static void getGuiStateGrapher( final MamutViewGrapher view, final Map< String, Object > guiState ) - { - final DataDisplayPanel< Spot, Link > dataDisplayPanel = view.getDataDisplayPanel(); - - // Transform. - final org.mastodon.views.grapher.datagraph.ScreenTransform t = dataDisplayPanel.getScreenTransform().get(); - guiState.put( GRAPHER_TRANSFORM_KEY, t ); - - // Coloring. - final ColoringModelMain< Spot, Link, BranchSpot, BranchLink > coloringModel = view.getColoringModel(); - getColoringState( coloringModel, guiState ); - - // Colorbar. - final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); - getColorBarOverlayState( colorBarOverlay, guiState ); - - // Context provider. - guiState.put( CHOSEN_CONTEXT_PROVIDER_KEY, view.getContextChooser().getChosenProvider().getName() ); - } - - /** - * Stores the {@link MamutViewTable} GUI state in the specified map. - * - * @param view - * the {@link MamutViewTable}. - * @param guiState - * the map to store info into. - */ - private static void getGuiStateTable( final MamutViewTable view, final Map< String, Object > guiState ) - { - // Currently displayed table. - final FeatureTagTablePanel< ? > currentlyDisplayedTable = view.getFrame().getCurrentlyDisplayedTable(); - String displayedTableName = ""; - - // Table visible rectangles. - final List< FeatureTagTablePanel< ? > > tables = view.getFrame().getTables(); - final List< String > names = view.getFrame().getTableNames(); - final List< Map< String, Object > > tableGuiStates = new ArrayList<>( names.size() ); - for ( int i = 0; i < names.size(); i++ ) - { - final String name = names.get( i ); - final FeatureTagTablePanel< ? > table = tables.get( i ); - - if ( table == currentlyDisplayedTable ) - displayedTableName = name; - - final JViewport viewportVertex = table.getScrollPane().getViewport(); - final Point tableRect = viewportVertex.getViewPosition(); - - final LinkedHashMap< String, Object > tableGuiState = new LinkedHashMap<>(); - tableGuiState.put( TABLE_NAME, name ); - tableGuiState.put( TABLE_VISIBLE_POS, new int[] { - tableRect.x, - tableRect.y } ); - - tableGuiStates.add( tableGuiState ); - } - guiState.put( TABLE_ELEMENT, tableGuiStates ); - guiState.put( TABLE_DISPLAYED, displayedTableName ); - - // Coloring for core graph. - final ColoringModel coloringModel = view.getColoringModel(); - getColoringState( coloringModel, guiState ); - - // Coloring for branch-graph. - final ColoringModel branchColoringModel = view.getBranchColoringModel(); - final Map< String, Object > branchGraphMap = new HashMap<>(); - getColoringState( branchColoringModel, branchGraphMap ); - guiState.put( BRANCH_GRAPH, branchGraphMap ); - - // Context provider. - guiState.put( CHOSEN_CONTEXT_PROVIDER_KEY, view.getContextChooser().getChosenProvider().getName() ); - } - - /** - * Stores the {@link MamutViewTrackScheme} GUI state in the specified map. - * - * @param view - * the {@link MamutViewTrackScheme}. - * @param guiState - * the map to store info into. - */ - private static void getGuiStateTrackScheme( final MamutViewTrackScheme view, final Map< String, Object > guiState ) - { - final TrackSchemePanel trackschemePanel = view.getFrame().getTrackschemePanel(); - - // Edit position to reflect the fact that we store the TrackScheme panel - // width and height. - final Point point = view.getFrame().getLocation(); - guiState.put( FRAME_POSITION_KEY, new int[] { - point.x, - point.y, - trackschemePanel.getDisplay().getWidth(), - trackschemePanel.getDisplay().getHeight() } ); - - // Transform. - final ScreenTransform t = trackschemePanel.getScreenTransform().get(); - guiState.put( TRACKSCHEME_TRANSFORM_KEY, t ); - - // Coloring. - final ColoringModelMain< Spot, Link, BranchSpot, BranchLink > coloringModel = view.getColoringModel(); - getColoringState( coloringModel, guiState ); - - // Colorbar. - final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); - getColorBarOverlayState( colorBarOverlay, guiState ); - - // Context provider. - guiState.put( CHOSEN_CONTEXT_PROVIDER_KEY, view.getContextChooser().getChosenProvider().getName() ); - } - - /** - * Stores the {@link MamutBranchViewTrackScheme} GUI state in the specified - * map. - * - * @param view - * the {@link MamutBranchViewTrackScheme}. - * @param guiState - * the map to store info into. - */ - private static void getGuiStateBranchTrackScheme( final MamutBranchViewTrackScheme view, - final Map< String, Object > guiState ) - { - final TrackSchemePanel trackschemePanel = view.getFrame().getTrackschemePanel(); - - // Edit position to reflect the fact that we store the TrackScheme panel - // width and height. - final Point point = view.getFrame().getLocation(); - guiState.put( FRAME_POSITION_KEY, new int[] { - point.x, - point.y, - trackschemePanel.getDisplay().getWidth(), - trackschemePanel.getDisplay().getHeight() } ); - - // Transform. - final ScreenTransform t = trackschemePanel.getScreenTransform().get(); - guiState.put( TRACKSCHEME_TRANSFORM_KEY, t ); - - // Coloring. - final ColoringModel coloringModel = view.getColoringModel(); - getColoringState( coloringModel, guiState ); - - // Colorbar. - final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); - getColorBarOverlayState( colorBarOverlay, guiState ); - } - - /** - * Stores the {@link MamutViewBdv} GUI state in the specified map. - * - * @param view - * the {@link MamutViewBdv}. - * @param guiState - * the map to store info into. - */ - private static void getGuiStateBdv( final MamutViewBdv view, final Map< String, Object > guiState ) - { - // Viewer state. - final Element stateEl = view.getViewerPanelMamut().stateToXml(); - guiState.put( BDV_STATE_KEY, stateEl ); - // Transform. - final AffineTransform3D t = new AffineTransform3D(); - view.getViewerPanelMamut().state().getViewerTransform( t ); - guiState.put( BDV_TRANSFORM_KEY, t ); - // Coloring. - final ColoringModel coloringModel = view.getColoringModel(); - getColoringState( coloringModel, guiState ); - // Colorbar. - final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); - getColorBarOverlayState( colorBarOverlay, guiState ); - } - - /** - * Stores the {@link MamutBranchViewBdv} GUI state in the specified map. - * - * @param view - * the {@link MamutViewBdv}. - * @param guiState - * the map to store info into. - */ - private static void getGuiStateBranchBdv( final MamutBranchViewBdv view, final Map< String, Object > guiState ) - { - // Viewer state. - final Element stateEl = view.getViewerPanelMamut().stateToXml(); - guiState.put( BDV_STATE_KEY, stateEl ); - // Transform. - final AffineTransform3D t = new AffineTransform3D(); - view.getViewerPanelMamut().state().getViewerTransform( t ); - guiState.put( BDV_TRANSFORM_KEY, t ); - // Coloring. - final ColoringModel coloringModel = view.getColoringModel(); - getColoringState( coloringModel, guiState ); - // Colorbar. - final ColorBarOverlay colorBarOverlay = view.getColorBarOverlay(); - getColorBarOverlayState( colorBarOverlay, guiState ); - } - - /** - * Reads the coloring state of a view and stores it into the specified map. - * - * @param coloringModel - * the coloring model to read from. - * @param guiState - * the map to store it to. - */ - private static void getColoringState( final ColoringModel coloringModel, final Map< String, Object > guiState ) - { - final boolean noColoring = coloringModel.noColoring(); - guiState.put( NO_COLORING_KEY, noColoring ); - if ( !noColoring ) - if ( coloringModel.getTagSet() != null ) - guiState.put( TAG_SET_KEY, coloringModel.getTagSet().getName() ); - else if ( coloringModel.getFeatureColorMode() != null ) - guiState.put( FEATURE_COLOR_MODE_KEY, coloringModel.getFeatureColorMode().getName() ); - } - - private static void getColorBarOverlayState( final ColorBarOverlay colorBarOverlay, - final Map< String, Object > guiState ) - { - guiState.put( COLORBAR_VISIBLE_KEY, colorBarOverlay.isVisible() ); - guiState.put( COLORBAR_POSITION_KEY, colorBarOverlay.getPosition() ); - } - - /** - * Deserializes a GUI state from XML and recreate view windows as specified. - * - * @param windowsEl - * the XML element that stores the GUI state of a view. - * @param windowManager - * the application {@link WindowManager}. - */ - static void fromXml( final Element windowsEl, final WindowManager windowManager ) - { - // To deal later with context providers. - final Map< String, ContextProvider< Spot > > contextProviders = new HashMap<>(); - final Map< ContextChooser< Spot >, String > contextChosers = new HashMap<>(); - - final List< Element > viewEls = windowsEl.getChildren( WINDOW_TAG ); - for ( final Element viewEl : viewEls ) - { - final Map< String, Object > guiState = xmlToMap( viewEl ); - final String typeStr = ( String ) guiState.get( VIEW_TYPE_KEY ); - switch ( typeStr ) - { - case "MamutViewBdv": - { - try - { - final MamutViewBdv bdv = windowManager.createBigDataViewer( guiState ); - - // Store context provider. - contextProviders.put( bdv.getContextProvider().getName(), bdv.getContextProvider() ); - } - catch ( final IllegalArgumentException iae ) - { - System.err.println( "Info: Failed restoring state of a BigDataViewer window, thus not showing it.\n" - + " You may want to resave your project to replace the previous (failing) state with the current (okay) state." ); - } - break; - } - - case "MamutBranchViewBdv": - { - windowManager.createBranchBigDataViewer( guiState ); - break; - } - - case "MamutViewTrackScheme": - { - final MamutViewTrackScheme ts = windowManager.createTrackScheme( guiState ); - - // Deal with context chooser. - final String desiredProvider = ( String ) guiState.get( CHOSEN_CONTEXT_PROVIDER_KEY ); - if ( null != desiredProvider ) - contextChosers.put( ts.getContextChooser(), desiredProvider ); - break; - } - - case "MamutBranchViewTrackScheme": - { - windowManager.createBranchTrackScheme( guiState ); - break; - } - - case "MamutBranchViewTrackSchemeHierarchy": - { - windowManager.createHierarchyTrackScheme( guiState ); - break; - } - - case "MamutViewTable": - { - final boolean selectionOnly = false; // FIXME - final MamutViewTable table = windowManager.createTable( selectionOnly, guiState ); - - // Deal with context chooser. // FIXME - final String desiredProvider = ( String ) guiState.get( CHOSEN_CONTEXT_PROVIDER_KEY ); - if ( null != desiredProvider ) - contextChosers.put( table.getContextChooser(), desiredProvider ); - break; - } - - case "MamutViewGrapher": - { - final MamutViewGrapher grapher = windowManager.createGrapher( guiState ); - - // Deal with context chooser. - final String desiredProvider = ( String ) guiState.get( CHOSEN_CONTEXT_PROVIDER_KEY ); - if ( null != desiredProvider ) - contextChosers.put( grapher.getContextChooser(), desiredProvider ); - break; - } - - default: - System.err.println( "Deserializing GUI state: Unknown window type: " + typeStr + "." ); - continue; - } - } - - /* - * Loop again on context choosers and try to give them their desired - * context provider. - */ - - for ( final ContextChooser< Spot > contextChooser : contextChosers.keySet() ) - { - final String desiredContextProvider = contextChosers.get( contextChooser ); - final ContextProvider< Spot > contextProvider = contextProviders.get( desiredContextProvider ); - if ( null != contextProvider ) - contextChooser.choose( contextProvider ); - } - } - - private static Map< String, Object > xmlToMap( final Element viewEl ) - { - final Map< String, Object > guiState = new HashMap<>(); - final List< Element > children = viewEl.getChildren(); - for ( final Element el : children ) - { - final String key = el.getName(); - final Object value; - switch ( key ) - { - case BDV_STATE_KEY: - value = el; - break; - case BDV_TRANSFORM_KEY: - value = XmlHelpers.getAffineTransform3D( viewEl, key ); - break; - case FRAME_POSITION_KEY: - final int[] pos = XmlHelpers.getIntArray( viewEl, key ); - value = sanitize( pos ); - break; - case TAG_SET_KEY: - case FEATURE_COLOR_MODE_KEY: - case VIEW_TYPE_KEY: - case CHOSEN_CONTEXT_PROVIDER_KEY: - value = el.getTextTrim(); - break; - case TRACKSCHEME_TRANSFORM_KEY: - { - final double[] arr = XmlHelpers.getDoubleArray( viewEl, key ); - value = new ScreenTransform( arr[ 0 ], arr[ 1 ], arr[ 2 ], arr[ 3 ], ( int ) arr[ 4 ], - ( int ) arr[ 5 ] ); - break; - } - case GRAPHER_TRANSFORM_KEY: - { - final double[] arr = XmlHelpers.getDoubleArray( viewEl, key ); - value = new org.mastodon.views.grapher.datagraph.ScreenTransform( arr[ 0 ], arr[ 1 ], arr[ 2 ], - arr[ 3 ], ( int ) arr[ 4 ], ( int ) arr[ 5 ] ); - break; - } - case NO_COLORING_KEY: - case SETTINGS_PANEL_VISIBLE_KEY: - case COLORBAR_VISIBLE_KEY: - value = XmlHelpers.getBoolean( viewEl, key ); - break; - case COLORBAR_POSITION_KEY: - final String str = XmlHelpers.getText( viewEl, key ); - value = Position.valueOf( str ); - break; - case GROUP_HANDLE_ID_KEY: - { - value = XmlHelpers.getInt( viewEl, key ); - break; - } - case TABLE_ELEMENT: - { - final List< Element > els = el.getChildren(); - final List< Map< String, Object > > maps = new ArrayList<>( els.size() ); - for ( final Element child : els ) - { - final String name = child.getChildTextTrim( TABLE_NAME ); - final int[] tablePos = XmlHelpers.getIntArray( child, TABLE_VISIBLE_POS ); - final Map< String, Object > m = new HashMap<>(); - m.put( TABLE_NAME, name ); - m.put( TABLE_VISIBLE_POS, tablePos ); - maps.add( m ); - } - value = maps; - break; - } - case TABLE_DISPLAYED: - value = XmlHelpers.getText( viewEl, TABLE_DISPLAYED ); - break; - case BRANCH_GRAPH: - value = xmlToMap( el ); - break; - default: - System.err.println( "Unknown GUI config parameter: " + key + " found in GUI file." ); - continue; - } - guiState.put( key, value ); - } - return guiState; - } - - private static final int MIN_WIDTH = 200; - - private static final int MIN_HEIGHT = MIN_WIDTH; - - /** - * Makes sure the specified position array won't end in creating windows - * off-screen. We impose that a window is fully on *one* screen and not - * split over severals. We also impose a minimal size for the windows. - *

    - * The pos array is { x, y, width, height }. - * - * @param pos - * the position array. - * @return the same position array. - */ - private static int[] sanitize( final int[] pos ) - { - assert pos.length == 4; - final GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - if ( null == ge ) - return pos; - final GraphicsDevice sd[] = ge.getScreenDevices(); - if ( sd.length < 1 ) - return pos; - - // Window min size. - pos[ 2 ] = Math.max( MIN_WIDTH, pos[ 2 ] ); - pos[ 3 ] = Math.max( MIN_HEIGHT, pos[ 3 ] ); - - for ( final GraphicsDevice gd : sd ) - { - final Rectangle bounds = gd.getDefaultConfiguration().getBounds(); - if ( bounds.contains( pos[ 0 ], pos[ 1 ], pos[ 2 ], pos[ 3 ] ) ) - // Fully in a screen, nothing to do. - return pos; - - if ( bounds.contains( pos[ 0 ], pos[ 1 ] ) ) - { - /* - * This window is on this screen, but exits it. First resize it - * so that it is not bigger than the screen. - */ - pos[ 2 ] = Math.min( bounds.width, pos[ 2 ] ); - pos[ 3 ] = Math.min( bounds.height, pos[ 3 ] ); - - /* - * Then move it back so that its bottom right corner is in the - * screen. - */ - if ( pos[ 0 ] + pos[ 2 ] > bounds.x + bounds.width ) - pos[ 0 ] -= ( pos[ 0 ] - bounds.x + pos[ 2 ] - bounds.width ); - - if ( pos[ 1 ] + pos[ 3 ] > bounds.y + bounds.height ) - pos[ 1 ] -= ( pos[ 1 ] - bounds.y + pos[ 3 ] - bounds.height ); - - return pos; - } - } - - /* - * Ok we did not find a screen in which this window is. So we will put - * it in the first screen. - */ - final Rectangle bounds = sd[ 0 ].getDefaultConfiguration().getBounds(); - pos[ 0 ] = Math.max( bounds.x, - Math.min( bounds.x + bounds.width - pos[ 2 ], pos[ 0 ] ) ); - pos[ 1 ] = Math.max( bounds.y, - Math.min( bounds.y + bounds.height - pos[ 3 ], pos[ 1 ] ) ); - - if ( bounds.contains( pos[ 0 ], pos[ 1 ], pos[ 2 ], pos[ 3 ] ) ) - // Fully in a screen, nothing to do. - return pos; - - /* - * This window is on this screen, but exits it. First resize it so that - * it is not bigger than the screen. - */ - pos[ 2 ] = Math.min( bounds.width, pos[ 2 ] ); - pos[ 3 ] = Math.min( bounds.height, pos[ 3 ] ); - - /* - * Then move it back so that its bottom right corner is in the screen. - */ - pos[ 0 ] -= ( pos[ 0 ] - bounds.x + pos[ 2 ] - bounds.width ); - pos[ 1 ] -= ( pos[ 1 ] - bounds.y + pos[ 3 ] - bounds.height ); - - return pos; - } -} diff --git a/src/main/java/org/mastodon/mamut/io/MamutViewStateXMLSerialization.java b/src/main/java/org/mastodon/mamut/io/MamutViewStateXMLSerialization.java new file mode 100644 index 000000000..f6d146a4e --- /dev/null +++ b/src/main/java/org/mastodon/mamut/io/MamutViewStateXMLSerialization.java @@ -0,0 +1,398 @@ +/*- + * #%L + * Mastodon + * %% + * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ +package org.mastodon.mamut.io; + +import static org.mastodon.mamut.views.MamutBranchView.BRANCH_GRAPH; +import static org.mastodon.mamut.views.MamutView.COLORBAR_POSITION_KEY; +import static org.mastodon.mamut.views.MamutView.COLORBAR_VISIBLE_KEY; +import static org.mastodon.mamut.views.MamutView.FEATURE_COLOR_MODE_KEY; +import static org.mastodon.mamut.views.MamutView.FRAME_POSITION_KEY; +import static org.mastodon.mamut.views.MamutView.GROUP_HANDLE_ID_KEY; +import static org.mastodon.mamut.views.MamutView.NO_COLORING_KEY; +import static org.mastodon.mamut.views.MamutView.SETTINGS_PANEL_VISIBLE_KEY; +import static org.mastodon.mamut.views.MamutView.TAG_SET_KEY; +import static org.mastodon.mamut.views.MamutViewFactory.VIEW_TYPE_KEY; +import static org.mastodon.mamut.views.bdv.MamutViewBdvFactory.BDV_STATE_KEY; +import static org.mastodon.mamut.views.bdv.MamutViewBdvFactory.BDV_TRANSFORM_KEY; +import static org.mastodon.mamut.views.grapher.MamutViewGrapherFactory.GRAPHER_TRANSFORM_KEY; +import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_DISPLAYED; +import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_ELEMENT; +import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_NAME; +import static org.mastodon.mamut.views.table.MamutViewTableFactory.TABLE_VISIBLE_POS; +import static org.mastodon.mamut.views.trackscheme.MamutViewTrackSchemeFactory.TRACKSCHEME_TRANSFORM_KEY; + +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.jdom2.Element; +import org.mastodon.mamut.MamutViews; +import org.mastodon.mamut.WindowManager; +import org.mastodon.mamut.views.MamutViewI; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; +import org.mastodon.views.trackscheme.ScreenTransform; + +import mpicbg.spim.data.XmlHelpers; +import net.imglib2.realtransform.AffineGet; + +/** + * Utility class that can transform a GUI state + * Map< String, Object > to XML and vice versa. + */ +class MamutViewStateXMLSerialization +{ + + private static final String WINDOW_TAG = "Window"; + + /** + * Key that specifies the name of the chosen context provider. Values are + * strings. + * + * FIXME Right now the chosen context provider is not serialized or + * deserialized. Deserializing it will be a bit tricky: when we recreate + * views, it is possible that a context chooser it set on a context provider + * that has not been created yet. + */ + private static final String CHOSEN_CONTEXT_PROVIDER_KEY = "ContextProvider"; + + static Element toXml( final Map< String, Object > guiState ) + { + final Element element = new Element( WINDOW_TAG ); + toXml( guiState, element ); + return element; + } + + private static void toXml( final Map< String, Object > map, final Element element ) + { + for ( final Entry< String, Object > entry : map.entrySet() ) + { + final Element el = toXml( entry.getKey(), entry.getValue() ); + element.addContent( el ); + } + } + + @SuppressWarnings( "unchecked" ) + static Element toXml( final String key, final Object value ) + { + final Element el; + if ( value instanceof Integer ) + el = XmlHelpers.intElement( key, ( Integer ) value ); + else if ( value instanceof int[] ) + el = XmlHelpers.intArrayElement( key, ( int[] ) value ); + else if ( value instanceof Double ) + el = XmlHelpers.doubleElement( key, ( Double ) value ); + else if ( value instanceof double[] ) + el = XmlHelpers.doubleArrayElement( key, ( double[] ) value ); + else if ( value instanceof AffineGet ) + el = XmlHelpers.affineTransform3DElement( key, ( AffineGet ) value ); + else if ( value instanceof Boolean ) + el = XmlHelpers.booleanElement( key, ( Boolean ) value ); + else if ( value instanceof String ) + { + el = new Element( key ); + el.setText( value.toString() ); + } + else if ( value instanceof ScreenTransform ) + { + final ScreenTransform t = ( ScreenTransform ) value; + el = XmlHelpers.doubleArrayElement( key, new double[] { + t.getMinX(), + t.getMaxX(), + t.getMinY(), + t.getMaxY(), + t.getScreenWidth(), + t.getScreenHeight() + } ); + } + else if ( value instanceof org.mastodon.views.grapher.datagraph.ScreenTransform ) + { + final org.mastodon.views.grapher.datagraph.ScreenTransform t = + ( org.mastodon.views.grapher.datagraph.ScreenTransform ) value; + el = XmlHelpers.doubleArrayElement( key, new double[] { + t.getMinX(), + t.getMaxX(), + t.getMinY(), + t.getMaxY(), + t.getScreenWidth(), + t.getScreenHeight() + } ); + } + else if ( value instanceof Position ) + { + el = new Element( key ); + el.setText( ( ( Position ) value ).name() ); + } + else if ( value instanceof Element ) + { + el = new Element( key ); + el.setContent( ( Element ) value ); + } + else if ( value instanceof Map ) + { + el = new Element( key ); + toXml( ( Map< String, Object > ) value, el ); + } + else if ( value instanceof List ) + { + el = new Element( key ); + final List< Object > os = ( List< Object > ) value; + for ( final Object o : os ) + { + final Element child = toXml( key, o ); + el.addContent( child ); + } + } + else + { + System.err.println( "Do not know how to serialize object " + value + " for key " + key + "." ); + el = null; + } + return el; + } + + /** + * Deserializes a GUI state from XML and recreate view windows as specified. + * + * @param windowsEl + * the XML element that stores the GUI state of a view. + * @param windowManager + * the application {@link WindowManager}. + */ + static void fromXml( final Element windowsEl, final WindowManager windowManager ) + { + final MamutViews viewFactories = windowManager.getViewFactories(); + final Collection< Class< ? extends MamutViewI > > classes = viewFactories.getKeys(); + + final List< Element > viewEls = windowsEl.getChildren( WINDOW_TAG ); + for ( final Element viewEl : viewEls ) + { + final Map< String, Object > guiState = xmlToMap( viewEl ); + final String typeStr = ( String ) guiState.get( VIEW_TYPE_KEY ); + + // First check that we know of the view type in the window manager. + Class< ? extends MamutViewI > klass = null; + for ( final Class< ? extends MamutViewI > cl : classes ) + { + if ( cl.getSimpleName().equals( typeStr ) ) + { + klass = cl; + break; + } + } + if ( klass == null ) + { + System.err.println( "Deserializing GUI state: Unknown view type: " + typeStr + "." ); + continue; + } + + // Create, register the view and sets its GUI state. + windowManager.createView( klass, guiState ); + } + } + + private static Map< String, Object > xmlToMap( final Element viewEl ) + { + final Map< String, Object > guiState = new HashMap<>(); + final List< Element > children = viewEl.getChildren(); + for ( final Element el : children ) + { + final String key = el.getName(); + final Object value; + switch ( key ) + { + case BDV_STATE_KEY: + value = el; + break; + case BDV_TRANSFORM_KEY: + value = XmlHelpers.getAffineTransform3D( viewEl, key ); + break; + case FRAME_POSITION_KEY: + final int[] pos = XmlHelpers.getIntArray( viewEl, key ); + value = sanitize( pos ); + break; + case TAG_SET_KEY: + case FEATURE_COLOR_MODE_KEY: + case VIEW_TYPE_KEY: + case CHOSEN_CONTEXT_PROVIDER_KEY: + value = el.getTextTrim(); + break; + case TRACKSCHEME_TRANSFORM_KEY: + { + final double[] arr = XmlHelpers.getDoubleArray( viewEl, key ); + value = new ScreenTransform( arr[ 0 ], arr[ 1 ], arr[ 2 ], arr[ 3 ], ( int ) arr[ 4 ], + ( int ) arr[ 5 ] ); + break; + } + case GRAPHER_TRANSFORM_KEY: + { + final double[] arr = XmlHelpers.getDoubleArray( viewEl, key ); + value = new org.mastodon.views.grapher.datagraph.ScreenTransform( arr[ 0 ], arr[ 1 ], arr[ 2 ], + arr[ 3 ], ( int ) arr[ 4 ], ( int ) arr[ 5 ] ); + break; + } + case NO_COLORING_KEY: + case SETTINGS_PANEL_VISIBLE_KEY: + case COLORBAR_VISIBLE_KEY: + value = XmlHelpers.getBoolean( viewEl, key ); + break; + case COLORBAR_POSITION_KEY: + final String str = XmlHelpers.getText( viewEl, key ); + value = Position.valueOf( str ); + break; + case GROUP_HANDLE_ID_KEY: + { + value = XmlHelpers.getInt( viewEl, key ); + break; + } + case TABLE_ELEMENT: + { + final List< Element > els = el.getChildren(); + final List< Map< String, Object > > maps = new ArrayList<>( els.size() ); + for ( final Element child : els ) + { + final String name = child.getChildTextTrim( TABLE_NAME ); + final int[] tablePos = XmlHelpers.getIntArray( child, TABLE_VISIBLE_POS ); + final Map< String, Object > m = new HashMap<>(); + m.put( TABLE_NAME, name ); + m.put( TABLE_VISIBLE_POS, tablePos ); + maps.add( m ); + } + value = maps; + break; + } + case TABLE_DISPLAYED: + value = XmlHelpers.getText( viewEl, TABLE_DISPLAYED ); + break; + case BRANCH_GRAPH: + value = xmlToMap( el ); + break; + default: + System.err.println( "Unknown GUI config parameter: " + key + " found in GUI file." ); + continue; + } + guiState.put( key, value ); + } + return guiState; + } + + private static final int MIN_WIDTH = 200; + + private static final int MIN_HEIGHT = MIN_WIDTH; + + /** + * Makes sure the specified position array won't end in creating windows + * off-screen. We impose that a window is fully on *one* screen and not + * split over severals. We also impose a minimal size for the windows. + *

    + * The pos array is { x, y, width, height }. + * + * @param pos + * the position array. + * @return the same position array. + */ + private static int[] sanitize( final int[] pos ) + { + assert pos.length == 4; + final GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + if ( null == ge ) + return pos; + final GraphicsDevice sd[] = ge.getScreenDevices(); + if ( sd.length < 1 ) + return pos; + + // Window min size. + pos[ 2 ] = Math.max( MIN_WIDTH, pos[ 2 ] ); + pos[ 3 ] = Math.max( MIN_HEIGHT, pos[ 3 ] ); + + for ( final GraphicsDevice gd : sd ) + { + final Rectangle bounds = gd.getDefaultConfiguration().getBounds(); + if ( bounds.contains( pos[ 0 ], pos[ 1 ], pos[ 2 ], pos[ 3 ] ) ) + // Fully in a screen, nothing to do. + return pos; + + if ( bounds.contains( pos[ 0 ], pos[ 1 ] ) ) + { + /* + * This window is on this screen, but exits it. First resize it + * so that it is not bigger than the screen. + */ + pos[ 2 ] = Math.min( bounds.width, pos[ 2 ] ); + pos[ 3 ] = Math.min( bounds.height, pos[ 3 ] ); + + /* + * Then move it back so that its bottom right corner is in the + * screen. + */ + if ( pos[ 0 ] + pos[ 2 ] > bounds.x + bounds.width ) + pos[ 0 ] -= ( pos[ 0 ] - bounds.x + pos[ 2 ] - bounds.width ); + + if ( pos[ 1 ] + pos[ 3 ] > bounds.y + bounds.height ) + pos[ 1 ] -= ( pos[ 1 ] - bounds.y + pos[ 3 ] - bounds.height ); + + return pos; + } + } + + /* + * Ok we did not find a screen in which this window is. So we will put + * it in the first screen. + */ + final Rectangle bounds = sd[ 0 ].getDefaultConfiguration().getBounds(); + pos[ 0 ] = Math.max( bounds.x, + Math.min( bounds.x + bounds.width - pos[ 2 ], pos[ 0 ] ) ); + pos[ 1 ] = Math.max( bounds.y, + Math.min( bounds.y + bounds.height - pos[ 3 ], pos[ 1 ] ) ); + + if ( bounds.contains( pos[ 0 ], pos[ 1 ], pos[ 2 ], pos[ 3 ] ) ) + // Fully in a screen, nothing to do. + return pos; + + /* + * This window is on this screen, but exits it. First resize it so that + * it is not bigger than the screen. + */ + pos[ 2 ] = Math.min( bounds.width, pos[ 2 ] ); + pos[ 3 ] = Math.min( bounds.height, pos[ 3 ] ); + + /* + * Then move it back so that its bottom right corner is in the screen. + */ + pos[ 0 ] -= ( pos[ 0 ] - bounds.x + pos[ 2 ] - bounds.width ); + pos[ 1 ] -= ( pos[ 1 ] - bounds.y + pos[ 3 ] - bounds.height ); + + return pos; + } +} diff --git a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java index 49b5a8106..a568fb3ac 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java @@ -353,7 +353,7 @@ public static synchronized ProjectModel openWithDialog( final MamutProject proje { return open( project, context, true, false ); } - catch ( final SpimDataIOException | RuntimeException e ) + catch ( final SpimDataIOException | UnknownHostException e ) { if ( getUserPermissionToOpenDummyData( project, e, parentComponent ) ) return open( project, context, true, true ); @@ -501,7 +501,7 @@ public static final void loadGUI( final MamutProject project, final WindowManage if ( null == windowsEl ) return; - MamutViewStateSerialization.fromXml( windowsEl, windowManager ); + MamutViewStateXMLSerialization.fromXml( windowsEl, windowManager ); } catch ( final FileNotFoundException fnfe ) { diff --git a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java index 19e71d4a7..a6cc383b6 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java @@ -27,6 +27,7 @@ import org.mastodon.app.MastodonIcons; import org.mastodon.graph.io.RawGraphIO.GraphToFileIdMap; import org.mastodon.mamut.MainWindow; +import org.mastodon.mamut.MamutViews; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.WindowManager; import org.mastodon.mamut.feature.MamutRawFeatureModelIO; @@ -37,6 +38,7 @@ import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; +import org.mastodon.mamut.views.MamutViewFactory; import org.mastodon.ui.keymap.KeymapManager; import org.mastodon.ui.util.ExtensionFileFilter; import org.mastodon.ui.util.FileChooser; @@ -250,7 +252,15 @@ private static void saveGUI( final ProjectWriter writer, final WindowManager win final Element guiRoot = new Element( GUI_TAG ); guiRoot.setAttribute( MAMUTPROJECT_VERSION_ATTRIBUTE_NAME, MAMUTPROJECT_VERSION_ATTRIBUTE_CURRENT ); final Element windows = new Element( WINDOWS_TAG ); - windowManager.forEachView( ( view ) -> windows.addContent( MamutViewStateSerialization.toXml( view ) ) ); + final MamutViews viewFactories = windowManager.getViewFactories(); + windowManager.forEachView( ( view ) -> { + @SuppressWarnings( "rawtypes" ) + final MamutViewFactory factory = viewFactories.getFactory( view.getClass() ); + @SuppressWarnings( "unchecked" ) + final Element element = MamutViewStateXMLSerialization.toXml( factory.getGuiState( view ) ); + windows.addContent( element ); + + } ); guiRoot.addContent( windows ); final Document doc = new Document( guiRoot ); final XMLOutputter xout = new XMLOutputter( Format.getPrettyFormat() ); diff --git a/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java b/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java index cd3bb2f26..545a719b9 100644 --- a/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java +++ b/src/main/java/org/mastodon/mamut/views/AbstractMamutViewFactory.java @@ -49,13 +49,19 @@ public void restoreGuiState( final T view, final Map< String, Object > guiState restoreColorbarState( view, guiState ); } + @Override + public String[] getCommandKeys() + { + // Default: not mapped. + return new String[] { "not mapped" }; + } + @Override public Map< String, Object > getGuiState( final T view ) { final Map< String, Object > guiState = new LinkedHashMap<>(); - // View type -> TODO change so that we can fish the right factory when - // deserializing. + // View type. guiState.put( VIEW_TYPE_KEY, view.getClass().getSimpleName() ); // Frame position and size. diff --git a/src/main/java/org/mastodon/mamut/views/MamutViewFactory.java b/src/main/java/org/mastodon/mamut/views/MamutViewFactory.java index 3dd435242..ac3f27176 100644 --- a/src/main/java/org/mastodon/mamut/views/MamutViewFactory.java +++ b/src/main/java/org/mastodon/mamut/views/MamutViewFactory.java @@ -56,4 +56,43 @@ public interface MamutViewFactory< T extends MamutViewI > extends SciJavaPlugin * @return a new map. */ public Map< String, Object > getGuiState( final T view ); + + /** + * Returns the name of the command that will use this factory to create a + * new view. + * + * @return the command name. + */ + public String getCommandName(); + + /** + * Returns the list of default keystrokes of the command. + * + * @return the default keystrokes0 + */ + public String[] getCommandKeys(); + + /** + * Returns the description of the command. + * + * @return the description. + */ + public String getCommandDescription(); + + /** + * Returns the text of the command to appear in menus. + * + * @return the menu text for the command. + */ + public String getCommandMenuText(); + + /** + * Returns the class of the view created by this factory. + *

    + * This class is used as key in several maps or to get the right factory + * when deserializing GUI state. + * + * @return the view class. + */ + public Class< T > getViewClass(); } diff --git a/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdv.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdv.java index b0cf43d0e..86993f3bb 100644 --- a/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdv.java +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdv.java @@ -129,6 +129,7 @@ public MamutBranchViewBdv( final ProjectModel appModel ) final JMenuHandle tagSetMenuHandle = new JMenuHandle(); final JMenuHandle colorbarMenuHandle = new JMenuHandle(); MainWindow.addMenus( menu, actionMap ); + appModel.getWindowManager().addWindowMenu( menu, actionMap ); MamutMenuBuilder.build( menu, actionMap, fileMenu( separator(), diff --git a/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdvFactory.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdvFactory.java index f8d135d7c..5117a40a8 100644 --- a/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdvFactory.java +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutBranchViewBdvFactory.java @@ -5,12 +5,17 @@ import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; import org.mastodon.mamut.views.MamutViewFactory; +import org.scijava.Priority; import org.scijava.plugin.Plugin; -@Plugin( type = MamutViewFactory.class ) +@Plugin( type = MamutViewFactory.class, priority = Priority.NORMAL - 7 ) public class MamutBranchViewBdvFactory extends AbstractMamutViewFactory< MamutBranchViewBdv > { + public static final String NEW_BRANCH_BDV_VIEW = "new branch bdv view"; + + public static final String[] NEW_BRANCH_BDV_VIEW_KEYS = new String[] { "not mapped" }; + @Override public MamutBranchViewBdv create( final ProjectModel projectModel ) { @@ -31,4 +36,34 @@ public void restoreGuiState( final MamutBranchViewBdv view, final Map< String, O super.restoreGuiState( view, guiState ); MamutViewBdvFactory.restoreBdvGuiState( view.getViewerPanelMamut(), guiState ); } + + @Override + public String getCommandName() + { + return NEW_BRANCH_BDV_VIEW; + } + + @Override + public String[] getCommandKeys() + { + return NEW_BRANCH_BDV_VIEW_KEYS; + } + + @Override + public String getCommandDescription() + { + return "Open a new branch BigDataViewer view."; + } + + @Override + public String getCommandMenuText() + { + return "New Bdv Branch"; + } + + @Override + public Class< MamutBranchViewBdv > getViewClass() + { + return MamutBranchViewBdv.class; + } } diff --git a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdv.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdv.java index 38709cb0b..b8a48b4c2 100644 --- a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdv.java +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdv.java @@ -271,6 +271,7 @@ public MamutViewBdv( final ProjectModel appModel ) tracksOverlay.getVisibilities().getVisibilityListeners().add( contextProvider::notifyContextChanged ); MainWindow.addMenus( menu, actionMap ); + appModel.getWindowManager().addWindowMenu( menu, actionMap ); MamutMenuBuilder.build( menu, actionMap, fileMenu( separator(), diff --git a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java index 4278a6e7b..ab2e0b009 100644 --- a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java @@ -6,6 +6,8 @@ import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; import org.mastodon.mamut.views.MamutViewFactory; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; +import org.scijava.Priority; import org.scijava.plugin.Plugin; import bdv.tools.InitializeViewerState; @@ -13,10 +15,45 @@ import bdv.viewer.ViewerState; import net.imglib2.realtransform.AffineTransform3D; -@Plugin( type = MamutViewFactory.class ) +/** + * Factory to create and display a BDV views. + *

    + * The GUI state is specified as a map of strings to objects. The accepted key + * and value types are: + *

      + *
    • 'FramePosition' → an int[] array of 4 + * elements: x, y, width and height. + *
    • 'LockGroupId' → an integer that specifies the lock + * group id. + *
    • 'SettingsPanelVisible' → a boolean that specifies + * whether the settings panel is visible on this view. + *
    • 'BdvState' → a XML Element that specifies the BDV + * window state. See {@link ViewerPanel#stateToXml()} and + * {@link ViewerPanel#stateFromXml(org.jdom2.Element)} for more information. + *
    • 'BdvTransform' → an {@link AffineTransform3D} that + * specifies the view point. + *
    • 'NoColoring' → a boolean; if true, the + * feature or tag coloring will be ignored. + *
    • 'TagSet' → a string specifying the name of the tag-set + * to use for coloring. If not null, the coloring will be done + * using the tag-set. + *
    • 'FeatureColorMode' → a String specifying the name of + * the feature color mode to use for coloring. If not null, the + * coloring will be done using the feature color mode. + *
    • 'ColorbarVisible' → a boolean specifying whether the + * colorbar is visible for tag-set and feature-based coloring. + *
    • 'ColorbarPosition' → a {@link Position} specifying the + * position of the colorbar. + *
    + */ +@Plugin( type = MamutViewFactory.class, priority = Priority.NORMAL ) public class MamutViewBdvFactory extends AbstractMamutViewFactory< MamutViewBdv > { + public static final String NEW_BDV_VIEW = "new bdv view"; + + static final String[] NEW_BDV_VIEW_KEYS = new String[] { "not mapped" }; + /** * Key for the {@link ViewerState} in a BDV view. Value is a XML * {@link Element} serialized from the state. @@ -77,4 +114,34 @@ static void restoreBdvGuiState( final ViewerPanel viewerPanel, final Map< String if ( null != stateEl ) viewerPanel.stateFromXml( stateEl ); } + + @Override + public String getCommandName() + { + return NEW_BDV_VIEW; + } + + @Override + public String[] getCommandKeys() + { + return NEW_BDV_VIEW_KEYS; + } + + @Override + public String getCommandDescription() + { + return "Open a new BigDataViewer view."; + } + + @Override + public String getCommandMenuText() + { + return "New Bdv"; + } + + @Override + public Class< MamutViewBdv > getViewClass() + { + return MamutViewBdv.class; + } } diff --git a/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapher.java b/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapher.java index 6d69a89d1..6737cccbe 100644 --- a/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapher.java +++ b/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapher.java @@ -102,8 +102,6 @@ public class MamutViewGrapher extends MamutView< DataGraph< Spot, Link >, DataVe */ private final ColoringModelMain< Spot, Link, BranchSpot, BranchLink > coloringModel; - private final DataDisplayPanel< Spot, Link > dataDisplayPanel; - private final ColorBarOverlay colorbarOverlay; public MamutViewGrapher( final ProjectModel appModel ) @@ -156,7 +154,7 @@ public MamutViewGrapher( final ProjectModel appModel ) groupHandle, contextChooser, options ); - dataDisplayPanel = frame.getDataDisplayPanel(); + final DataDisplayPanel< Spot, Link > dataDisplayPanel = frame.getDataDisplayPanel(); // If they are available, set some sensible defaults for the feature. final FeatureSpecPair spvx = new FeatureSpecPair( SpotFrameFeature.SPEC, @@ -203,6 +201,7 @@ public MamutViewGrapher( final ProjectModel appModel ) final JMenuHandle colorbarMenuHandle = new JMenuHandle(); MainWindow.addMenus( menu, actionMap ); + appModel.getWindowManager().addWindowMenu( menu, actionMap ); MamutMenuBuilder.build( menu, actionMap, viewMenu( colorMenu( coloringMenuHandle ), @@ -242,15 +241,17 @@ public MamutViewGrapher( final ProjectModel appModel ) dataDisplayPanel.getDisplay().requestFocusInWindow(); } + @SuppressWarnings( "unchecked" ) @Override - public ContextChooser< Spot > getContextChooser() + public DataDisplayFrame< Spot, Link > getFrame() { - return contextChooser; + return ( DataDisplayFrame< Spot, Link > ) super.getFrame(); } - public DataDisplayPanel< Spot, Link > getDataDisplayPanel() + @Override + public ContextChooser< Spot > getContextChooser() { - return dataDisplayPanel; + return contextChooser; } @Override diff --git a/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java b/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java index 2df7fe4bb..0f4562b68 100644 --- a/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java +++ b/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java @@ -5,13 +5,50 @@ import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; import org.mastodon.mamut.views.MamutViewFactory; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.views.grapher.datagraph.ScreenTransform; +import org.scijava.Priority; import org.scijava.plugin.Plugin; -@Plugin( type = MamutViewFactory.class ) +/** + * Factory to Create and display Grapher views. + *

    + * The GUI state is specified as a map of strings to objects. The accepted key + * and value types are: + *

      + *
    • 'FramePosition' → an int[] array of 4 + * elements: x, y, width and height. + *
    • 'LockGroupId' → an integer that specifies the lock + * group id. + *
    • 'SettingsPanelVisible' → a boolean that specifies + * whether the settings panel is visible on this view. + *
    • 'NoColoring' → a boolean; if true, the + * feature or tag coloring will be ignored. + *
    • 'TagSet' → a string specifying the name of the tag-set + * to use for coloring. If not null, the coloring will be done + * using the tag-set. + *
    • 'FeatureColorMode' → a @link String specifying the name + * of the feature color mode to use for coloring. If not null, the + * coloring will be done using the feature color mode. + *
    • 'ColorbarVisible' → a boolean specifying whether the + * colorbar is visible for tag-set and feature-based coloring. + *
    • 'ColorbarPosition' → a {@link Position} specifying the + * position of the colorbar. + *
    • 'GrapherTransform' → a + * {@link org.mastodon.views.grapher.datagraph.ScreenTransform} specifying the + * region to initially zoom on the XY plot. + * + *
    + * + * @param guiState + * the map of settings. + */ +@Plugin( type = MamutViewFactory.class, priority = Priority.NORMAL - 4 ) public class MamutViewGrapherFactory extends AbstractMamutViewFactory< MamutViewGrapher > { + public static final String NEW_GRAPHER_VIEW = "new grapher view"; + /** * Key for the transform in a Grapher view. Value is a Grapher * ScreenTransform instance. @@ -28,6 +65,10 @@ public MamutViewGrapher create( final ProjectModel projectModel ) public Map< String, Object > getGuiState( final MamutViewGrapher view ) { final Map< String, Object > guiState = super.getGuiState( view ); + // Transform. + final ScreenTransform t = view.getFrame().getDataDisplayPanel().getScreenTransform().get(); + guiState.put( GRAPHER_TRANSFORM_KEY, t ); + return guiState; } @@ -40,6 +81,30 @@ public void restoreGuiState( final MamutViewGrapher view, final Map< String, Obj // Transform. final ScreenTransform tLoaded = ( ScreenTransform ) guiState.get( GRAPHER_TRANSFORM_KEY ); if ( null != tLoaded ) - view.getDataDisplayPanel().getScreenTransform().set( tLoaded ); + view.getFrame().getDataDisplayPanel().getScreenTransform().set( tLoaded ); + } + + @Override + public String getCommandName() + { + return NEW_GRAPHER_VIEW; + } + + @Override + public String getCommandDescription() + { + return "Open a new Grapher view."; + } + + @Override + public String getCommandMenuText() + { + return "New Grapher"; + } + + @Override + public Class< MamutViewGrapher > getViewClass() + { + return MamutViewGrapher.class; } } diff --git a/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java b/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java index 2fe8f04da..1f023049c 100644 --- a/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java +++ b/src/main/java/org/mastodon/mamut/views/table/MamutViewSelectionTableFactory.java @@ -1,16 +1,63 @@ package org.mastodon.mamut.views.table; +import java.util.Map; + import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.views.AbstractMamutViewFactory; import org.mastodon.mamut.views.MamutViewFactory; +import org.scijava.Priority; import org.scijava.plugin.Plugin; -@Plugin( type = MamutViewFactory.class ) -public class MamutViewSelectionTableFactory extends MamutViewTableFactory +@Plugin( type = MamutViewFactory.class, priority = Priority.NORMAL - 3 ) +public class MamutViewSelectionTableFactory extends AbstractMamutViewFactory< MamutViewSelectionTable > { + public static final String NEW_SELECTION_TABLE_VIEW = "new selection table view"; + @Override - public MamutViewTable create( final ProjectModel projectModel ) + public MamutViewSelectionTable create( final ProjectModel projectModel ) { return new MamutViewSelectionTable( projectModel ); } + + @Override + public Map< String, Object > getGuiState( final MamutViewSelectionTable view ) + { + final Map< String, Object > guiState = super.getGuiState( view ); + MamutViewTableFactory.getGuiStateTable( view, guiState ); + return guiState; + } + + @Override + public void restoreGuiState( final MamutViewSelectionTable view, final Map< String, Object > guiState ) + { + super.restoreGuiState( view, guiState ); + MamutViewTableFactory.restoreGuiStateTable( view, guiState ); + } + + @Override + public String getCommandName() + { + return NEW_SELECTION_TABLE_VIEW; + } + + @Override + public String getCommandMenuText() + { + return "New Selection Table view"; + } + + @Override + public String getCommandDescription() + { + return "Open a new selection table view. " + + "The table only displays the current selection and " + + "is updated as the selection changes."; + } + + @Override + public Class< MamutViewSelectionTable > getViewClass() + { + return MamutViewSelectionTable.class; + } } diff --git a/src/main/java/org/mastodon/mamut/views/table/MamutViewTable.java b/src/main/java/org/mastodon/mamut/views/table/MamutViewTable.java index 967e39666..d45419621 100644 --- a/src/main/java/org/mastodon/mamut/views/table/MamutViewTable.java +++ b/src/main/java/org/mastodon/mamut/views/table/MamutViewTable.java @@ -180,6 +180,7 @@ protected MamutViewTable( final ProjectModel projectModel, final boolean selecti final JMenuHandle colorBranchMenuHandle = new JMenuHandle(); final JMenuHandle tagSetMenuHandle = new JMenuHandle(); MainWindow.addMenus( menu, actionMap ); + appModel.getWindowManager().addWindowMenu( menu, actionMap ); MamutMenuBuilder.build( menu, actionMap, fileMenu( separator(), diff --git a/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java b/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java index 55e025a82..bc877837d 100644 --- a/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java +++ b/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java @@ -15,15 +15,45 @@ import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; import org.mastodon.mamut.views.MamutViewFactory; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.ui.coloring.ColoringModel; import org.mastodon.views.table.FeatureTagTablePanel; import org.mastodon.views.table.TableViewFrameBuilder.MyTableViewFrame; +import org.scijava.Priority; import org.scijava.plugin.Plugin; -@Plugin( type = MamutViewFactory.class ) +/** + * Factory to create and display Tables. + *

    + * The GUI state is specified as a map of strings to objects. The accepted key + * and value types are: + *

      + *
    • 'FramePosition' → an int[] array of 4 + * elements: x, y, width and height. + *
    • 'LockGroupId' → an integer that specifies the lock + * group id. + *
    • 'SettingsPanelVisible' → a boolean that specifies + * whether the settings panel is visible on this view. + *
    • 'NoColoring' → a boolean; if true, the + * feature or tag coloring will be ignored. + *
    • 'TagSet' → a string specifying the name of the tag-set + * to use for coloring. If not null, the coloring will be done + * using the tag-set. + *
    • 'FeatureColorMode' → a @link String specifying the name + * of the feature color mode to use for coloring. If not null, the + * coloring will be done using the feature color mode. + *
    • 'ColorbarVisible' → a boolean specifying whether the + * colorbar is visible for tag-set and feature-based coloring. + *
    • 'ColorbarPosition' → a {@link Position} specifying the + * position of the colorbar. + *
    + */ +@Plugin( type = MamutViewFactory.class, priority = Priority.NORMAL - 2 ) public class MamutViewTableFactory extends AbstractMamutViewFactory< MamutViewTable > { + public static final String NEW_TABLE_VIEW = "new full table view"; + /** * Key that specifies whether a table is currently showing the vertex table. * If false, then the edge table is displayed. @@ -130,6 +160,11 @@ static void getGuiStateTable( final MamutViewTable view, final Map< String, Obje public void restoreGuiState( final MamutViewTable view, final Map< String, Object > guiState ) { super.restoreGuiState( view, guiState ); + restoreGuiStateTable( view, guiState ); + } + + static final void restoreGuiStateTable( final MamutViewTable view, final Map< String, Object > guiState ) + { // Restore branch-graph coloring. @SuppressWarnings( "unchecked" ) final Map< String, Object > branchGraphGuiState = ( Map< String, Object > ) guiState.getOrDefault( BRANCH_GRAPH, Collections.EMPTY_MAP ); @@ -160,4 +195,28 @@ public void restoreGuiState( final MamutViewTable view, final Map< String, Objec } } } + + @Override + public String getCommandName() + { + return NEW_TABLE_VIEW; + } + + @Override + public String getCommandDescription() + { + return "Open a new table view."; + } + + @Override + public String getCommandMenuText() + { + return "New Data table"; + } + + @Override + public Class< MamutViewTable > getViewClass() + { + return MamutViewTable.class; + } } diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java index 3735c21e3..a7b12251f 100644 --- a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java @@ -217,6 +217,7 @@ protected MamutBranchViewTrackScheme( final JMenuHandle colorbarMenuHandle = new JMenuHandle(); MainWindow.addMenus( menu, actionMap ); + appModel.getWindowManager().addWindowMenu( menu, actionMap ); MamutMenuBuilder.build( menu, actionMap, viewMenu( branchColorMenu( coloringMenuHandle ), diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeFactory.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeFactory.java index 7722d370e..a70c1a209 100644 --- a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeFactory.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeFactory.java @@ -4,10 +4,16 @@ import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; +import org.mastodon.mamut.views.MamutViewFactory; +import org.scijava.Priority; +import org.scijava.plugin.Plugin; +@Plugin( type = MamutViewFactory.class, priority = Priority.NORMAL - 5 ) public class MamutBranchViewTrackSchemeFactory extends AbstractMamutViewFactory< MamutBranchViewTrackScheme > { + public static final String NEW_BRANCH_TRACKSCHEME_VIEW = "new branch trackscheme view"; + @Override public MamutBranchViewTrackScheme create( final ProjectModel projectModel ) { @@ -28,4 +34,28 @@ public void restoreGuiState( final MamutBranchViewTrackScheme view, final Map< S super.restoreGuiState( view, guiState ); MamutViewTrackSchemeFactory.restoreTrackSchemeTransform( view.getFrame().getTrackschemePanel(), guiState ); } + + @Override + public String getCommandName() + { + return NEW_BRANCH_TRACKSCHEME_VIEW; + } + + @Override + public String getCommandDescription() + { + return "Open a new branch TrackScheme view."; + } + + @Override + public String getCommandMenuText() + { + return "New TrackScheme Branch"; + } + + @Override + public Class< MamutBranchViewTrackScheme > getViewClass() + { + return MamutBranchViewTrackScheme.class; + } } diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchyFactory.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchyFactory.java index 1f3e975cb..7b6f184bb 100644 --- a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchyFactory.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchyFactory.java @@ -4,10 +4,16 @@ import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; +import org.mastodon.mamut.views.MamutViewFactory; +import org.scijava.Priority; +import org.scijava.plugin.Plugin; +@Plugin( type = MamutViewFactory.class, priority = Priority.NORMAL - 6 ) public class MamutBranchViewTrackSchemeHierarchyFactory extends AbstractMamutViewFactory< MamutBranchViewTrackSchemeHierarchy > { + public static final String NEW_HIERARCHY_TRACKSCHEME_VIEW = "new hierarchy trackscheme view"; + @Override public MamutBranchViewTrackSchemeHierarchy create( final ProjectModel projectModel ) { @@ -28,4 +34,28 @@ public void restoreGuiState( final MamutBranchViewTrackSchemeHierarchy view, fin super.restoreGuiState( view, guiState ); MamutViewTrackSchemeFactory.restoreTrackSchemeTransform( view.getFrame().getTrackschemePanel(), guiState ); } + + @Override + public String getCommandName() + { + return NEW_HIERARCHY_TRACKSCHEME_VIEW; + } + + @Override + public String getCommandDescription() + { + return "Open a new hierarchy TrackScheme view."; + } + + @Override + public String getCommandMenuText() + { + return "New TrackScheme Hierarchy"; + } + + @Override + public Class< MamutBranchViewTrackSchemeHierarchy > getViewClass() + { + return MamutBranchViewTrackSchemeHierarchy.class; + } } diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackScheme.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackScheme.java index c49167299..b845bc184 100644 --- a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackScheme.java @@ -205,6 +205,7 @@ public MamutViewTrackScheme( final ProjectModel appModel ) final JMenuHandle colorbarMenuHandle = new JMenuHandle(); MainWindow.addMenus( menu, actionMap ); + appModel.getWindowManager().addWindowMenu( menu, actionMap ); MamutMenuBuilder.build( menu, actionMap, viewMenu( colorMenu( coloringMenuHandle ), diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackSchemeFactory.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackSchemeFactory.java index 19231098e..c5a673d08 100644 --- a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackSchemeFactory.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutViewTrackSchemeFactory.java @@ -4,12 +4,48 @@ import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.views.AbstractMamutViewFactory; +import org.mastodon.mamut.views.MamutViewFactory; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; import org.mastodon.views.trackscheme.ScreenTransform; import org.mastodon.views.trackscheme.display.TrackSchemePanel; +import org.scijava.Priority; +import org.scijava.plugin.Plugin; +/** + * + * Factory to create and display a TrackScheme views. + *

    + * The GUI state is specified as a map of strings to objects. The accepted key + * and value types are:: + *

      + *
    • 'FramePosition' → an int[] array of 4 + * elements: x, y, width and height. + *
    • 'LockGroupId' → an integer that specifies the lock + * group id. + *
    • 'SettingsPanelVisible' → a boolean that specifies + * whether the settings panel is visible on this view. + *
    • 'TrackSchemeTransform' → a {@link ScreenTransform} that + * defines the starting view zone in TrackScheme. + *
    • 'NoColoring' → a boolean; if true, the + * feature or tag coloring will be ignored. + *
    • 'TagSet' → a string specifying the name of the tag-set + * to use for coloring. If not null, the coloring will be done + * using the tag-set. + *
    • 'FeatureColorMode' → a @link String specifying the name + * of the feature color mode to use for coloring. If not null, the + * coloring will be done using the feature color mode. + *
    • 'ColorbarVisible' → a boolean specifying whether the + * colorbar is visible for tag-set and feature-based coloring. + *
    • 'ColorbarPosition' → a {@link Position} specifying the + * position of the colorbar. + *
    + */ +@Plugin( type = MamutViewFactory.class, priority = Priority.NORMAL - 1 ) public class MamutViewTrackSchemeFactory extends AbstractMamutViewFactory< MamutViewTrackScheme > { + public static final String NEW_TRACKSCHEME_VIEW = "new trackscheme view"; + /** * Key for the transform in a TrackScheme view. Value is a * {@link ScreenTransform} instance. @@ -51,4 +87,28 @@ static void restoreTrackSchemeTransform( final TrackSchemePanel trackSchemePanel if ( null != tLoaded ) trackSchemePanel.getScreenTransform().set( tLoaded ); } + + @Override + public String getCommandName() + { + return NEW_TRACKSCHEME_VIEW; + } + + @Override + public String getCommandDescription() + { + return "Open a new TrackScheme view."; + } + + @Override + public String getCommandMenuText() + { + return "New TrackScheme"; + } + + @Override + public Class< MamutViewTrackScheme > getViewClass() + { + return MamutViewTrackScheme.class; + } } diff --git a/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java b/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java index 32aeb36c1..abf082728 100644 --- a/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java +++ b/src/test/java/org/mastodon/mamut/GarbageCollectionTest.java @@ -40,6 +40,14 @@ import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.ModelGraph; +import org.mastodon.mamut.views.bdv.MamutBranchViewBdv; +import org.mastodon.mamut.views.bdv.MamutViewBdv; +import org.mastodon.mamut.views.grapher.MamutViewGrapher; +import org.mastodon.mamut.views.table.MamutViewSelectionTable; +import org.mastodon.mamut.views.table.MamutViewTable; +import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackScheme; +import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeHierarchy; +import org.mastodon.mamut.views.trackscheme.MamutViewTrackScheme; import org.mastodon.util.GarbageCollectionUtils; import org.scijava.Context; @@ -90,6 +98,7 @@ public void testIfMastodonIsGarbageCollectable() * Open a Mastodon project with all different windows and close it. * Return a weak reference to the ModelGraph. */ + @SuppressWarnings( { "unchecked", "rawtypes" } ) static WeakReference< ModelGraph > openAndCloseMastodon( final Context context ) { try @@ -101,14 +110,18 @@ static WeakReference< ModelGraph > openAndCloseMastodon( final Context context ) final ModelGraph modelGraph = appModel.getModel().getGraph(); final WindowManager windowManager = appModel.getWindowManager(); - windowManager.createTrackScheme(); - windowManager.createBranchTrackScheme(); - windowManager.createHierarchyTrackScheme(); - windowManager.createBigDataViewer(); - windowManager.createBranchBigDataViewer(); - windowManager.createGrapher(); - windowManager.createTable( false ); - windowManager.createTable( true ); + final Class[] viewClasses = new Class[] { + MamutViewTrackScheme.class, + MamutBranchViewTrackScheme.class, + MamutBranchViewTrackSchemeHierarchy.class, + MamutViewBdv.class, + MamutBranchViewBdv.class, + MamutViewGrapher.class, + MamutViewTable.class, + MamutViewSelectionTable.class + }; + for ( final Class klass : viewClasses ) + windowManager.createView( klass ); windowManager.editTagSets(); mainWindow.close(); return new WeakReference<>( modelGraph ); From 6003af3b44fd30cf576dd9b8163b3edc523ded21 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Mon, 21 Aug 2023 13:07:12 +0200 Subject: [PATCH 040/220] Make the createView() method synchronized. --- src/main/java/org/mastodon/mamut/WindowManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 5d78152f4..18a1a84ef 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -255,7 +255,7 @@ public < T extends MamutViewI > T createView( final Class< T > klass ) * the GUI state map. * @return a new instance of the view, that was shown. */ - public < T extends MamutViewI > T createView( final Class< T > klass, final Map< String, Object > guiState ) + public synchronized < T extends MamutViewI > T createView( final Class< T > klass, final Map< String, Object > guiState ) { // Get the right factory. final MamutViewFactory< T > factory = mamutViews.getFactory( klass ); From 88dafd0b2c705aac11b649c7b8d18781b599eb9a Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Mon, 21 Aug 2023 13:37:08 +0200 Subject: [PATCH 041/220] Use a discoverable pattern for style managers and settings page. Some managers and page, the ones related to the view styles, are now managed by a factory, like for the views. Has less impact than the views but makes the views completely extensible. --- .../org/mastodon/mamut/WindowManager.java | 68 ++++++++++++++----- .../DataDisplayStyleManagerFactory.java | 38 +++++++++++ .../RenderSettingsManagerFactory.java | 38 +++++++++++ .../mamut/managers/StyleManagerFactory.java | 54 +++++++++++++++ .../TrackSchemeStyleManagerFactory.java | 38 +++++++++++ 5 files changed, 218 insertions(+), 18 deletions(-) create mode 100644 src/main/java/org/mastodon/mamut/managers/DataDisplayStyleManagerFactory.java create mode 100644 src/main/java/org/mastodon/mamut/managers/RenderSettingsManagerFactory.java create mode 100644 src/main/java/org/mastodon/mamut/managers/StyleManagerFactory.java create mode 100644 src/main/java/org/mastodon/mamut/managers/TrackSchemeStyleManagerFactory.java diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 18a1a84ef..49d17adf8 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -54,6 +54,7 @@ import org.mastodon.feature.FeatureSpecsService; import org.mastodon.feature.ui.FeatureColorModeConfigPage; import org.mastodon.mamut.feature.MamutFeatureProjectionsManager; +import org.mastodon.mamut.managers.StyleManagerFactory; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; import org.mastodon.mamut.views.MamutViewFactory; @@ -68,17 +69,10 @@ import org.mastodon.ui.keymap.Keymap; import org.mastodon.ui.keymap.KeymapManager; import org.mastodon.ui.keymap.KeymapSettingsPage; -import org.mastodon.util.ToggleDialogAction; -import org.mastodon.views.bdv.overlay.ui.RenderSettingsConfigPage; -import org.mastodon.views.bdv.overlay.ui.RenderSettingsManager; import org.mastodon.views.context.ContextChooser; import org.mastodon.views.context.ContextProvider; import org.mastodon.views.context.HasContextChooser; import org.mastodon.views.context.HasContextProvider; -import org.mastodon.views.grapher.display.style.DataDisplayStyleManager; -import org.mastodon.views.grapher.display.style.DataDisplayStyleSettingsPage; -import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleManager; -import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleSettingsPage; import org.scijava.Context; import org.scijava.InstantiableException; import org.scijava.listeners.Listeners; @@ -88,6 +82,8 @@ import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.RunnableAction; +import bdv.tools.ToggleDialogAction; +import bdv.ui.settings.SettingsPage; import bdv.util.InvokeOnEDT; /** @@ -164,11 +160,17 @@ public WindowManager( final ProjectModel appModel ) final Actions projectActions = appModel.getProjectActions(); /* - * Create and store managers. + * Preferences dialog. */ - managers.put( TrackSchemeStyleManager.class, new TrackSchemeStyleManager() ); - managers.put( DataDisplayStyleManager.class, new DataDisplayStyleManager() ); - managers.put( RenderSettingsManager.class, new RenderSettingsManager() ); + this.settings = new PreferencesDialog( null, keymap, new String[] { KeyConfigContexts.MASTODON } ); + final ToggleDialogAction tooglePreferencesDialogAction = new ToggleDialogAction( PREFERENCES_DIALOG, settings ); + projectActions.namedAction( tooglePreferencesDialogAction, PREFERENCES_DIALOG_KEYS ); + + /* + * Create, discover and store managers. + */ + + discoverManagers(); final FeatureColorModeManager featureColorModeManager = new FeatureColorModeManager(); managers.put( FeatureColorModeManager.class, featureColorModeManager ); final MamutFeatureProjectionsManager featureProjectionsManager = new MamutFeatureProjectionsManager( context.getService( FeatureSpecsService.class ), featureColorModeManager ); @@ -206,18 +208,12 @@ public WindowManager( final ProjectModel appModel ) projectActions.namedAction( openOnlineDocumentation, OPEN_ONLINE_DOCUMENTATION_KEYS ); /* - * Preferences dialog. + * Extra settings pages. */ - this.settings = new PreferencesDialog( null, keymap, new String[] { KeyConfigContexts.MASTODON } ); - settings.addPage( new TrackSchemeStyleSettingsPage( "TrackScheme Styles", getManager( TrackSchemeStyleManager.class ) ) ); - settings.addPage( new RenderSettingsConfigPage( "BDV Render Settings", getManager( RenderSettingsManager.class ) ) ); - settings.addPage( new DataDisplayStyleSettingsPage( "Grapher styles", getManager( DataDisplayStyleManager.class ) ) ); settings.addPage( new KeymapSettingsPage( "Keymap", keymapManager, descriptions ) ); settings.addPage( new FeatureColorModeConfigPage( "Feature Color Modes", featureColorModeManager, featureProjectionsManager, "Spot", "Link" ) ); settings.pack(); - final ToggleDialogAction tooglePreferencesDialogAction = new ToggleDialogAction( PREFERENCES_DIALOG, settings ); - projectActions.namedAction( tooglePreferencesDialogAction, PREFERENCES_DIALOG_KEYS ); /* * Tag-set and feature computation dialogs @@ -372,6 +368,42 @@ private MamutViews discoverViewFactories() return mamutViews; } + /** + * Discovers the {@link StyleManagerFactory}s present at runtime. Uses them + * to instantiate the managers, and registers them into the + * {@link #managers} map. If the factory can return a {@link SettingsPage}, + * create one and add it to the {@link #settings} page. + */ + @SuppressWarnings( { "rawtypes", "unchecked" } ) + private void discoverManagers() + { + final Context context = appModel.getContext(); + if ( context != null ) + { + final PluginService pluginService = context.getService( PluginService.class ); + final List< PluginInfo< StyleManagerFactory > > infos = pluginService.getPluginsOfType( StyleManagerFactory.class ); + for ( final PluginInfo< StyleManagerFactory > info : infos ) + { + try + { + final StyleManagerFactory factory = info.createInstance(); + context.inject( factory ); + // Add to managers map. + final Object manager = factory.create( appModel ); + managers.put( factory.getManagerClass(), manager ); + // Settings page. + if ( factory.hasSettingsPage() ) + settings.addPage( factory.createSettingsPage( manager ) ); + } + catch ( final InstantiableException e ) + { + e.printStackTrace(); + } + } + } + + } + /** * Returns the manager object of the specified class used in this window * manager, or null if a manager of the specified class does diff --git a/src/main/java/org/mastodon/mamut/managers/DataDisplayStyleManagerFactory.java b/src/main/java/org/mastodon/mamut/managers/DataDisplayStyleManagerFactory.java new file mode 100644 index 000000000..e49bea0d8 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/managers/DataDisplayStyleManagerFactory.java @@ -0,0 +1,38 @@ +package org.mastodon.mamut.managers; + +import org.mastodon.mamut.ProjectModel; +import org.mastodon.views.grapher.display.style.DataDisplayStyleManager; +import org.mastodon.views.grapher.display.style.DataDisplayStyleSettingsPage; +import org.scijava.Priority; +import org.scijava.plugin.Plugin; + +import bdv.ui.settings.SettingsPage; + +@Plugin( type = StyleManagerFactory.class, priority = Priority.NORMAL - 2 ) +public class DataDisplayStyleManagerFactory implements StyleManagerFactory< DataDisplayStyleManager > +{ + + @Override + public DataDisplayStyleManager create( final ProjectModel projectModel ) + { + return new DataDisplayStyleManager(); + } + + @Override + public boolean hasSettingsPage() + { + return true; + } + + @Override + public SettingsPage createSettingsPage( final DataDisplayStyleManager manager ) + { + return new DataDisplayStyleSettingsPage( "Grapher Styles", manager ); + } + + @Override + public Class< DataDisplayStyleManager > getManagerClass() + { + return DataDisplayStyleManager.class; + } +} diff --git a/src/main/java/org/mastodon/mamut/managers/RenderSettingsManagerFactory.java b/src/main/java/org/mastodon/mamut/managers/RenderSettingsManagerFactory.java new file mode 100644 index 000000000..9483e328d --- /dev/null +++ b/src/main/java/org/mastodon/mamut/managers/RenderSettingsManagerFactory.java @@ -0,0 +1,38 @@ +package org.mastodon.mamut.managers; + +import org.mastodon.mamut.ProjectModel; +import org.mastodon.views.bdv.overlay.ui.RenderSettingsConfigPage; +import org.mastodon.views.bdv.overlay.ui.RenderSettingsManager; +import org.scijava.Priority; +import org.scijava.plugin.Plugin; + +import bdv.ui.settings.SettingsPage; + +@Plugin( type = StyleManagerFactory.class, priority = Priority.NORMAL ) +public class RenderSettingsManagerFactory implements StyleManagerFactory< RenderSettingsManager > +{ + + @Override + public RenderSettingsManager create( final ProjectModel projectModel ) + { + return new RenderSettingsManager(); + } + + @Override + public boolean hasSettingsPage() + { + return true; + } + + @Override + public SettingsPage createSettingsPage( final RenderSettingsManager manager ) + { + return new RenderSettingsConfigPage( "BDV Render Settings", manager ); + } + + @Override + public Class< RenderSettingsManager > getManagerClass() + { + return RenderSettingsManager.class; + } +} diff --git a/src/main/java/org/mastodon/mamut/managers/StyleManagerFactory.java b/src/main/java/org/mastodon/mamut/managers/StyleManagerFactory.java new file mode 100644 index 000000000..82b9819da --- /dev/null +++ b/src/main/java/org/mastodon/mamut/managers/StyleManagerFactory.java @@ -0,0 +1,54 @@ +package org.mastodon.mamut.managers; + +import org.mastodon.mamut.ProjectModel; +import org.scijava.plugin.SciJavaPlugin; + +import bdv.ui.settings.SettingsPage; + +/** + * Interface for discoverable style manager factories. + *

    + * Such factories are meant to be automatically discovered by the window + * manager, and used to create style managers. + * + * @param + * TODO + */ +public interface StyleManagerFactory< T > extends SciJavaPlugin +{ + + /** + * Creates a new manager instance for the specified project model. + * + * @param projectModel + * the project model. + * + * @return a new manager instance. + */ + public T create( final ProjectModel projectModel ); + + /** + * Returns true if the manager handled by this factory has a + * {@link SettingsPage} that can configure it. + * + * @return whether there is a settings page for the manager. + */ + public boolean hasSettingsPage(); + + /** + * Creates a new settings page for the specified manager. + * + * @param manager + * the manager. + * @return a new settings page. + */ + public SettingsPage createSettingsPage( T manager ); + + /** + * Returns the class of the manager created by this factory. + * + * @return the manager class. + */ + public Class< T > getManagerClass(); + +} diff --git a/src/main/java/org/mastodon/mamut/managers/TrackSchemeStyleManagerFactory.java b/src/main/java/org/mastodon/mamut/managers/TrackSchemeStyleManagerFactory.java new file mode 100644 index 000000000..149bf5075 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/managers/TrackSchemeStyleManagerFactory.java @@ -0,0 +1,38 @@ +package org.mastodon.mamut.managers; + +import org.mastodon.mamut.ProjectModel; +import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleManager; +import org.mastodon.views.trackscheme.display.style.TrackSchemeStyleSettingsPage; +import org.scijava.Priority; +import org.scijava.plugin.Plugin; + +import bdv.ui.settings.SettingsPage; + +@Plugin( type = StyleManagerFactory.class, priority = Priority.NORMAL - 1 ) +public class TrackSchemeStyleManagerFactory implements StyleManagerFactory< TrackSchemeStyleManager > +{ + + @Override + public TrackSchemeStyleManager create( final ProjectModel projectModel ) + { + return new TrackSchemeStyleManager(); + } + + @Override + public boolean hasSettingsPage() + { + return true; + } + + @Override + public SettingsPage createSettingsPage( final TrackSchemeStyleManager manager ) + { + return new TrackSchemeStyleSettingsPage( "TrackScheme Styles", manager ); + } + + @Override + public Class< TrackSchemeStyleManager > getManagerClass() + { + return TrackSchemeStyleManager.class; + } +} From f114f35d00a4daf6f3a75224be935083e9e1d6b8 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Mon, 21 Aug 2023 13:37:35 +0200 Subject: [PATCH 042/220] Remove unused class. Replaced by the bdv.tools.ToggleDialogAction class. --- .../org/mastodon/util/ToggleDialogAction.java | 85 ------------------- 1 file changed, 85 deletions(-) delete mode 100644 src/main/java/org/mastodon/util/ToggleDialogAction.java diff --git a/src/main/java/org/mastodon/util/ToggleDialogAction.java b/src/main/java/org/mastodon/util/ToggleDialogAction.java deleted file mode 100644 index a32b131ee..000000000 --- a/src/main/java/org/mastodon/util/ToggleDialogAction.java +++ /dev/null @@ -1,85 +0,0 @@ -/*- - * #%L - * Mastodon - * %% - * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ -package org.mastodon.util; - -import java.awt.Dialog; -import java.awt.event.ActionEvent; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; - -import org.scijava.listeners.Listeners; -import org.scijava.ui.behaviour.util.AbstractNamedAction; - -public class ToggleDialogAction extends AbstractNamedAction implements HasSelectedState -{ - private static final long serialVersionUID = 1L; - - protected final Dialog dialog; - - protected final Listeners.List< Listener > selectListeners; - - public ToggleDialogAction( final String name, final Dialog dialog ) - { - super( name ); - this.dialog = dialog; - selectListeners = new Listeners.SynchronizedList<>(); - dialog.addComponentListener( new ComponentAdapter() - { - @Override - public void componentShown( final ComponentEvent e ) - { - selectListeners.list.forEach( l -> l.setSelected( true ) ); - } - - @Override - public void componentHidden( final ComponentEvent e ) - { - selectListeners.list.forEach( l -> l.setSelected( false ) ); - } - } ); - } - - @Override - public void actionPerformed( final ActionEvent arg0 ) - { - dialog.setVisible( !dialog.isVisible() ); - } - - @Override - public boolean isSelected() - { - return dialog.isVisible(); - } - - @Override - public Listeners< Listener > selectListeners() - { - return selectListeners; - } -} From e1e5b2baf02773734f924acbace942247390ad8f Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Mon, 21 Aug 2023 14:34:24 +0200 Subject: [PATCH 043/220] Use a common utility to discover plugins. There is the pluginService.createInstancesOfType() that is very concise, but I want to make it possible for a plugin to be disabled, using the flat Plugin( type = ....class, enabled = false ). In that case and with the new utility, the class is not instantiated by the service, which makes it possible to use it "manually", or disable unwanted plugin simply. --- .../org/mastodon/app/plugin/PluginUtils.java | 77 +++++++++++++++++++ .../mastodon/feature/FeatureSpecsService.java | 8 +- .../java/org/mastodon/mamut/ProjectModel.java | 27 ++----- .../org/mastodon/mamut/WindowManager.java | 60 +++------------ 4 files changed, 98 insertions(+), 74 deletions(-) create mode 100644 src/main/java/org/mastodon/app/plugin/PluginUtils.java diff --git a/src/main/java/org/mastodon/app/plugin/PluginUtils.java b/src/main/java/org/mastodon/app/plugin/PluginUtils.java new file mode 100644 index 000000000..8d09aeb0c --- /dev/null +++ b/src/main/java/org/mastodon/app/plugin/PluginUtils.java @@ -0,0 +1,77 @@ +package org.mastodon.app.plugin; + +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +import org.scijava.Context; +import org.scijava.InstantiableException; +import org.scijava.plugin.PluginInfo; +import org.scijava.plugin.PluginService; +import org.scijava.plugin.SciJavaPlugin; + +/** + * Static utilities to manage and discover classes that typically implement + * generic plugin functionalities. + */ +public class PluginUtils +{ + + /** + * Discovers plugins of the specified class, and executes the specified + * action on all of them that are marked as enabled. + * + * @param + * the type of plugin to discover. + * @param pluginClass + * the class of plugin. + * @param action + * the action to execute. + * @param context + * the current context. + */ + public static < T extends SciJavaPlugin > void forEachDiscoveredPlugin( final Class< T > pluginClass, final Consumer< ? super T > action, final Context context ) + { + final BiConsumer< ? super T, PluginInfo< T > > bc = ( plugin, info ) -> action.accept( plugin ); + forEachDiscoveredPlugin( pluginClass, bc, context ); + } + + /** + * Discovers plugins of the specified class, and executes the specified + * action on all of them that are marked as enabled. + *

    + * This version of the method accepts a {@link BiConsumer}, that will also + * receive the plugin info. + * + * @param + * the type of plugin to discover. + * @param pluginClass + * the class of plugin. + * @param action + * the action to execute. + * @param context + * the current context. + */ + public static < T extends SciJavaPlugin > void forEachDiscoveredPlugin( final Class< T > pluginClass, final BiConsumer< ? super T, PluginInfo< T > > action, final Context context ) + { + final PluginService pluginService = context.getService( PluginService.class ); + final List< PluginInfo< T > > infos = pluginService.getPluginsOfType( pluginClass ); + for ( final PluginInfo< T > info : infos ) + { + if ( !info.isEnabled() ) + continue; + + try + { + final T plugin = info.createInstance(); + context.inject( plugin ); + action.accept( plugin, info ); + } + catch ( final InstantiableException e ) + { + e.printStackTrace(); + } + } + } + +} diff --git a/src/main/java/org/mastodon/feature/FeatureSpecsService.java b/src/main/java/org/mastodon/feature/FeatureSpecsService.java index eb834611d..92b8c994a 100644 --- a/src/main/java/org/mastodon/feature/FeatureSpecsService.java +++ b/src/main/java/org/mastodon/feature/FeatureSpecsService.java @@ -34,9 +34,8 @@ import java.util.List; import java.util.Map; -import org.scijava.plugin.Parameter; +import org.mastodon.app.plugin.PluginUtils; import org.scijava.plugin.Plugin; -import org.scijava.plugin.PluginService; import org.scijava.service.AbstractService; import org.scijava.service.SciJavaService; @@ -46,8 +45,6 @@ @Plugin( type = FeatureSpecsService.class ) public class FeatureSpecsService extends AbstractService implements SciJavaService { - @Parameter - private PluginService pluginService; private final List< FeatureSpec< ?, ? > > specs = new ArrayList<>(); @@ -78,8 +75,7 @@ private void clear() */ private void discover() { - for ( final FeatureSpec< ?, ? > spec : pluginService.createInstancesOfType( FeatureSpec.class ) ) - add( spec ); + PluginUtils.forEachDiscoveredPlugin( FeatureSpec.class, this::add, getContext() ); } /** diff --git a/src/main/java/org/mastodon/mamut/ProjectModel.java b/src/main/java/org/mastodon/mamut/ProjectModel.java index 1ef7f26f3..a5386d863 100644 --- a/src/main/java/org/mastodon/mamut/ProjectModel.java +++ b/src/main/java/org/mastodon/mamut/ProjectModel.java @@ -28,10 +28,11 @@ */ package org.mastodon.mamut; -import java.util.List; +import java.util.function.Consumer; import org.mastodon.app.MastodonAppModel; import org.mastodon.app.plugin.MastodonAppPluginModel; +import org.mastodon.app.plugin.PluginUtils; import org.mastodon.mamut.io.ProjectActions; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.model.BoundingSphereRadiusStatistics; @@ -47,10 +48,7 @@ import org.mastodon.ui.keymap.KeymapManager; import org.mastodon.views.bdv.SharedBigDataViewerData; import org.scijava.Context; -import org.scijava.InstantiableException; import org.scijava.listeners.Listeners; -import org.scijava.plugin.PluginInfo; -import org.scijava.plugin.PluginService; import org.scijava.ui.behaviour.KeyPressedManager; import org.scijava.ui.behaviour.util.Actions; @@ -197,23 +195,12 @@ private void discoverPlugins() if ( context == null ) return; - final PluginService pluginService = context.getService( PluginService.class ); - final List< PluginInfo< MamutPlugin > > infos = pluginService.getPluginsOfType( MamutPlugin.class ); final MamutPlugins plugins = ( MamutPlugins ) getPlugins(); - for ( final PluginInfo< MamutPlugin > info : infos ) - { - try - { - final MamutPlugin plugin = info.createInstance(); - context.inject( plugin ); - plugins.register( plugin ); - } - catch ( final InstantiableException e ) - { - e.printStackTrace(); - } - } - plugins.setAppPluginModel( this ); + final Consumer< MamutPlugin > registerAction = ( mp ) -> { + mp.setAppPluginModel( this ); + plugins.register( mp ); + }; + PluginUtils.forEachDiscoveredPlugin( MamutPlugin.class, registerAction, context ); } public MamutProject getProject() diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 49d17adf8..2360fd723 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -50,6 +50,7 @@ import javax.swing.ActionMap; import javax.swing.JDialog; +import org.mastodon.app.plugin.PluginUtils; import org.mastodon.app.ui.ViewMenu; import org.mastodon.feature.FeatureSpecsService; import org.mastodon.feature.ui.FeatureColorModeConfigPage; @@ -74,11 +75,8 @@ import org.mastodon.views.context.HasContextChooser; import org.mastodon.views.context.HasContextProvider; import org.scijava.Context; -import org.scijava.InstantiableException; import org.scijava.listeners.Listeners; import org.scijava.plugin.Plugin; -import org.scijava.plugin.PluginInfo; -import org.scijava.plugin.PluginService; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.RunnableAction; @@ -346,25 +344,8 @@ public void addWindowMenu( final ViewMenu menu, final ActionMap actionMap ) private MamutViews discoverViewFactories() { final MamutViews mamutViews = new MamutViews(); - final Context context = appModel.getContext(); - if ( context != null ) - { - final PluginService pluginService = context.getService( PluginService.class ); - final List< PluginInfo< MamutViewFactory > > infos = pluginService.getPluginsOfType( MamutViewFactory.class ); - for ( final PluginInfo< MamutViewFactory > info : infos ) - { - try - { - final MamutViewFactory factory = info.createInstance(); - context.inject( factory ); - mamutViews.register( factory, appModel ); - } - catch ( final InstantiableException e ) - { - e.printStackTrace(); - } - } - } + final Consumer< MamutViewFactory > registerViewFactory = factory -> mamutViews.register( factory, appModel ); + PluginUtils.forEachDiscoveredPlugin( MamutViewFactory.class, registerViewFactory, appModel.getContext() ); return mamutViews; } @@ -377,31 +358,14 @@ private MamutViews discoverViewFactories() @SuppressWarnings( { "rawtypes", "unchecked" } ) private void discoverManagers() { - final Context context = appModel.getContext(); - if ( context != null ) - { - final PluginService pluginService = context.getService( PluginService.class ); - final List< PluginInfo< StyleManagerFactory > > infos = pluginService.getPluginsOfType( StyleManagerFactory.class ); - for ( final PluginInfo< StyleManagerFactory > info : infos ) - { - try - { - final StyleManagerFactory factory = info.createInstance(); - context.inject( factory ); - // Add to managers map. - final Object manager = factory.create( appModel ); - managers.put( factory.getManagerClass(), manager ); - // Settings page. - if ( factory.hasSettingsPage() ) - settings.addPage( factory.createSettingsPage( manager ) ); - } - catch ( final InstantiableException e ) - { - e.printStackTrace(); - } - } - } - + final Consumer< StyleManagerFactory > registerAction = ( factory ) -> { + final Object manager = factory.create( appModel ); + managers.put( factory.getManagerClass(), manager ); + // Settings page. + if ( factory.hasSettingsPage() ) + settings.addPage( factory.createSettingsPage( manager ) ); + }; + PluginUtils.forEachDiscoveredPlugin( StyleManagerFactory.class, registerAction, appModel.getContext() ); } /** @@ -450,7 +414,7 @@ private < T extends MamutViewI > List< T > getViewList( final Class< T > klass ) */ public < T extends MamutViewI > void forEachView( final Class< T > klass, final Consumer< T > action ) { - Optional.of( getViewList( klass ) ) + Optional.ofNullable( getViewList( klass ) ) .orElse( Collections.emptyList() ) .forEach( action ); } From dd191bc0b8c4160704d02ed2ecaa475766fb86db Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Mon, 21 Aug 2023 14:34:38 +0200 Subject: [PATCH 044/220] Remove unused method. --- src/main/java/org/mastodon/app/plugin/MastodonPlugins.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/org/mastodon/app/plugin/MastodonPlugins.java b/src/main/java/org/mastodon/app/plugin/MastodonPlugins.java index 4bdb88cbf..0e2d46039 100644 --- a/src/main/java/org/mastodon/app/plugin/MastodonPlugins.java +++ b/src/main/java/org/mastodon/app/plugin/MastodonPlugins.java @@ -79,12 +79,6 @@ public synchronized void register( final PL plugin ) } } - public void setAppPluginModel( final M model ) - { - for ( final PL plugin : plugins ) - plugin.setAppPluginModel( model ); - } - public void addMenus( final ViewMenu menu ) { addMenus( menu, pluginActions.getActionMap() ); From 2b45a2dd33c083d4ac2351890f45e3cc316526c6 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Mon, 21 Aug 2023 14:35:05 +0200 Subject: [PATCH 045/220] Add TODO. Remove the Mastodon CommandDescriptionProvider and replace by the BDV-core equivalent. --- .../java/org/mastodon/ui/keymap/CommandDescriptionProvider.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/mastodon/ui/keymap/CommandDescriptionProvider.java b/src/main/java/org/mastodon/ui/keymap/CommandDescriptionProvider.java index 84b5431c3..547f8a678 100644 --- a/src/main/java/org/mastodon/ui/keymap/CommandDescriptionProvider.java +++ b/src/main/java/org/mastodon/ui/keymap/CommandDescriptionProvider.java @@ -37,6 +37,8 @@ *

    * (This allows to discover Plugin shortcuts which cannot be hardwired into the * default keymap.) + * + * TODO: remove and replace by the BDV equivalent. */ public abstract class CommandDescriptionProvider implements SciJavaPlugin { From 6f22746d25038d4d85ad4e37efbc8f1f20fe1c6c Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Mon, 21 Aug 2023 15:43:41 +0200 Subject: [PATCH 046/220] Replace KeyMap and associated classes by upstream implementations. These classes have been migrated in upstream repos, mainly the BDV-core and ui-behaviour. We can remove them from Mastodon and use the common ones, maintained elsewhere. There are two adaptations specific for Mastodon: 1/ The KeymapManager class is extended by a specific one for Mastodon so that we can load and save keymaps in the Mastodon folder, and so that we load the builtin keymaps we had before. 2/ The new CommandDescription requires specifying a context AND now a scope. I made two scopes: one for the actions that are generic to Mastodon (everything in views, that do not know of the Mamut model), and one specific for the Mamut application (everything under org.mastodon.mamut, which is the one users have). I also made a static method to create a ProjectModel, and hide the creation of the KeymapManager and KeyPressedManager there. I could not replace one class: - KeymapSettingsPage: There is the equivalent in BDV-core, but it does not 'see' the builtin keymaps we have in Mastodon. --- .../org/mastodon/app/MastodonAppModel.java | 9 +- .../mastodon/app/plugin/MastodonPlugins.java | 3 +- .../mastodon/app/ui/CloseWindowActions.java | 7 +- .../mastodon/app/ui/MastodonFrameView.java | 5 +- .../app/ui/MastodonFrameViewActions.java | 8 +- .../mastodon/app/ui/SearchVertexLabel.java | 8 +- .../java/org/mastodon/app/ui/ViewMenu.java | 3 +- .../mamut/BranchGraphUndoActions.java | 8 +- .../org/mastodon/mamut/DumpInputConfig.java | 4 +- .../org/mastodon/mamut/KeyConfigScopes.java | 44 ++++ .../java/org/mastodon/mamut/MainWindow.java | 4 +- .../java/org/mastodon/mamut/MamutActions.java | 6 +- .../java/org/mastodon/mamut/MamutViews.java | 6 +- .../org/mastodon/mamut/PreferencesDialog.java | 2 +- .../java/org/mastodon/mamut/ProjectModel.java | 20 +- .../java/org/mastodon/mamut/UndoActions.java | 6 +- .../org/mastodon/mamut/WindowManager.java | 14 +- .../org/mastodon/mamut/io/ProjectActions.java | 7 +- .../org/mastodon/mamut/io/ProjectLoader.java | 6 +- .../org/mastodon/mamut/io/ProjectSaver.java | 6 +- .../mastodon/mamut/plugin/MamutPlugins.java | 3 +- .../mamut/plugin/MamutTestPlugin.java | 9 +- .../mastodon/mamut/views/MamutBranchView.java | 5 +- .../mastodon/model/tag/ui/TagSetDialog.java | 2 +- .../java/org/mastodon/ui/EditTagActions.java | 7 +- .../java/org/mastodon/ui/FocusActions.java | 8 +- .../org/mastodon/ui/HighlightBehaviours.java | 8 +- .../org/mastodon/ui/SelectionActions.java | 7 +- .../ui/keymap/CommandDescriptions.java | 162 ------------ .../ui/keymap/CommandDescriptionsBuilder.java | 162 ------------ .../mastodon/ui/keymap/KeyConfigContexts.java | 1 - ...tionProvider.java => KeyConfigScopes.java} | 38 +-- .../java/org/mastodon/ui/keymap/Keymap.java | 138 ---------- .../org/mastodon/ui/keymap/KeymapManager.java | 239 ------------------ .../ui/keymap/KeymapSettingsPage.java | 7 +- .../ui/keymap/MastodonKeymapManager.java | 62 +++++ .../views/bdv/BigDataViewerActionsMamut.java | 7 +- .../bdv/NavigationActionsDescriptions.java | 16 +- .../TransformEventHandler2DDescriptions.java | 10 +- .../TransformEventHandler3DDescriptions.java | 10 +- .../RecordMaxProjectionMovieDialog.java | 11 +- .../views/bdv/export/RecordMovieDialog.java | 11 +- .../bdv/overlay/BdvSelectionBehaviours.java | 7 +- .../views/bdv/overlay/EditBehaviours.java | 7 +- .../bdv/overlay/EditSpecialBehaviours.java | 7 +- .../views/bdv/overlay/OverlayActions.java | 7 +- .../display/DataDisplayNavigationActions.java | 7 +- .../DataDisplayNavigationBehaviours.java | 7 +- .../grapher/display/DataDisplayZoom.java | 7 +- .../InertialScreenTransformEventHandler.java | 7 +- .../views/table/TableViewActions.java | 7 +- .../display/EditFocusVertexLabelAction.java | 7 +- .../InertialScreenTransformEventHandler.java | 7 +- .../display/ShowSelectedTracksActions.java | 11 +- .../display/ToggleLinkBehaviour.java | 12 +- .../display/TrackSchemeNavigationActions.java | 7 +- .../TrackSchemeNavigationBehaviours.java | 14 +- .../trackscheme/display/TrackSchemeZoom.java | 12 +- .../ui/FeatureColorModeConfigPageDemo.java | 3 +- 59 files changed, 338 insertions(+), 897 deletions(-) create mode 100644 src/main/java/org/mastodon/mamut/KeyConfigScopes.java delete mode 100644 src/main/java/org/mastodon/ui/keymap/CommandDescriptions.java delete mode 100644 src/main/java/org/mastodon/ui/keymap/CommandDescriptionsBuilder.java rename src/main/java/org/mastodon/ui/keymap/{CommandDescriptionProvider.java => KeyConfigScopes.java} (61%) delete mode 100644 src/main/java/org/mastodon/ui/keymap/Keymap.java delete mode 100644 src/main/java/org/mastodon/ui/keymap/KeymapManager.java create mode 100644 src/main/java/org/mastodon/ui/keymap/MastodonKeymapManager.java diff --git a/src/main/java/org/mastodon/app/MastodonAppModel.java b/src/main/java/org/mastodon/app/MastodonAppModel.java index 1eddf1319..4a1e3d308 100644 --- a/src/main/java/org/mastodon/app/MastodonAppModel.java +++ b/src/main/java/org/mastodon/app/MastodonAppModel.java @@ -46,12 +46,13 @@ import org.mastodon.model.NavigationHandler; import org.mastodon.model.SelectionModel; import org.mastodon.model.TimepointModel; -import org.mastodon.ui.keymap.Keymap; -import org.mastodon.ui.keymap.KeymapManager; import org.scijava.ui.behaviour.KeyPressedManager; import org.scijava.ui.behaviour.io.InputTriggerConfig; import org.scijava.ui.behaviour.util.Actions; +import bdv.ui.keymap.Keymap; +import bdv.ui.keymap.KeymapManager; + /** * Data class that stores the data model and the application model of a Mastodon * application. @@ -159,7 +160,7 @@ public MastodonAppModel( this.keymapManager = keymapManager; this.keyConfigContexts = keyConfigContexts; - final InputTriggerConfig keyconf = keymapManager.getForwardDefaultKeymap().getConfig(); + final InputTriggerConfig keyconf = keymapManager.getForwardSelectedKeymap().getConfig(); this.modelActions = new Actions( keyconf, keyConfigContexts ); } @@ -190,7 +191,7 @@ public GroupManager getGroupManager() public Keymap getKeymap() { - return keymapManager.getForwardDefaultKeymap(); + return keymapManager.getForwardSelectedKeymap(); } public String[] getKeyConfigContexts() diff --git a/src/main/java/org/mastodon/app/plugin/MastodonPlugins.java b/src/main/java/org/mastodon/app/plugin/MastodonPlugins.java index 0e2d46039..1711ed82b 100644 --- a/src/main/java/org/mastodon/app/plugin/MastodonPlugins.java +++ b/src/main/java/org/mastodon/app/plugin/MastodonPlugins.java @@ -37,9 +37,10 @@ import org.mastodon.app.ui.ViewMenuBuilder; import org.mastodon.app.ui.ViewMenuBuilder.MenuItem; import org.mastodon.ui.keymap.KeyConfigContexts; -import org.mastodon.ui.keymap.Keymap; import org.scijava.ui.behaviour.util.Actions; +import bdv.ui.keymap.Keymap; + public class MastodonPlugins< PL extends MastodonPlugin< M >, M extends MastodonAppPluginModel > { private final ArrayList< PL > plugins = new ArrayList<>(); diff --git a/src/main/java/org/mastodon/app/ui/CloseWindowActions.java b/src/main/java/org/mastodon/app/ui/CloseWindowActions.java index f2e1a9aea..67480e20b 100644 --- a/src/main/java/org/mastodon/app/ui/CloseWindowActions.java +++ b/src/main/java/org/mastodon/app/ui/CloseWindowActions.java @@ -38,10 +38,11 @@ import javax.swing.JDialog; import javax.swing.JFrame; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedAction; import org.scijava.ui.behaviour.util.Actions; @@ -59,7 +60,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.MASTODON ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.MASTODON ); } @Override diff --git a/src/main/java/org/mastodon/app/ui/MastodonFrameView.java b/src/main/java/org/mastodon/app/ui/MastodonFrameView.java index bdde17f84..b755211fb 100644 --- a/src/main/java/org/mastodon/app/ui/MastodonFrameView.java +++ b/src/main/java/org/mastodon/app/ui/MastodonFrameView.java @@ -41,13 +41,14 @@ import org.mastodon.graph.Vertex; import org.mastodon.graph.ref.AbstractListenableEdge; import org.mastodon.model.AbstractSpot; -import org.mastodon.ui.keymap.Keymap; -import org.mastodon.ui.keymap.Keymap.UpdateListener; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.Behaviours; import org.scijava.ui.behaviour.util.WrappedActionMap; import org.scijava.ui.behaviour.util.WrappedInputMap; +import bdv.ui.keymap.Keymap; +import bdv.ui.keymap.Keymap.UpdateListener; + /** * A {@link MastodonView} that is displayed in a {@link ViewFrame} (instead of * just a panel, for instance). diff --git a/src/main/java/org/mastodon/app/ui/MastodonFrameViewActions.java b/src/main/java/org/mastodon/app/ui/MastodonFrameViewActions.java index 3775f2501..78bba7865 100644 --- a/src/main/java/org/mastodon/app/ui/MastodonFrameViewActions.java +++ b/src/main/java/org/mastodon/app/ui/MastodonFrameViewActions.java @@ -33,12 +33,13 @@ import java.awt.event.ComponentEvent; import java.awt.event.WindowEvent; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.util.HasSelectedState; import org.scijava.listeners.Listeners; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedAction; import org.scijava.ui.behaviour.util.Actions; @@ -60,7 +61,8 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.BIGDATAVIEWER, KeyConfigContexts.TRACKSCHEME, KeyConfigContexts.TABLE ); + // TODO add grapher? + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER, KeyConfigContexts.TRACKSCHEME, KeyConfigContexts.TABLE ); } @Override diff --git a/src/main/java/org/mastodon/app/ui/SearchVertexLabel.java b/src/main/java/org/mastodon/app/ui/SearchVertexLabel.java index 419ff31a9..69b6bec7b 100644 --- a/src/main/java/org/mastodon/app/ui/SearchVertexLabel.java +++ b/src/main/java/org/mastodon/app/ui/SearchVertexLabel.java @@ -68,12 +68,13 @@ import org.mastodon.model.HasLabel; import org.mastodon.model.NavigationHandler; import org.mastodon.model.SelectionModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.util.KeyConfigUtils; import org.mastodon.views.trackscheme.util.AlphanumCompare; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.RunnableAction; @@ -152,7 +153,8 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.BIGDATAVIEWER, KeyConfigContexts.TRACKSCHEME, KeyConfigContexts.TABLE ); + // TODO add grapher + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER, KeyConfigContexts.TRACKSCHEME, KeyConfigContexts.TABLE ); } @Override diff --git a/src/main/java/org/mastodon/app/ui/ViewMenu.java b/src/main/java/org/mastodon/app/ui/ViewMenu.java index e33b0e37d..705fe16e5 100644 --- a/src/main/java/org/mastodon/app/ui/ViewMenu.java +++ b/src/main/java/org/mastodon/app/ui/ViewMenu.java @@ -43,13 +43,14 @@ import javax.swing.JSeparator; import javax.swing.MenuElement; -import org.mastodon.ui.keymap.Keymap; import org.mastodon.util.HasSelectedState; import org.mastodon.util.MastodonDebugSettings; import org.scijava.ui.behaviour.InputTrigger; import org.scijava.ui.behaviour.io.InputTriggerConfig; import org.scijava.ui.behaviour.util.AbstractNamedAction; +import bdv.ui.keymap.Keymap; + public class ViewMenu { private static final boolean USE_ACCELERATORS = MastodonDebugSettings.getInstance().isUseMenuAccelerators(); // TODO: remove, once Fiji ships at least jdk1.8.0_162 diff --git a/src/main/java/org/mastodon/mamut/BranchGraphUndoActions.java b/src/main/java/org/mastodon/mamut/BranchGraphUndoActions.java index 7b1b5cea7..bac2879ee 100644 --- a/src/main/java/org/mastodon/mamut/BranchGraphUndoActions.java +++ b/src/main/java/org/mastodon/mamut/BranchGraphUndoActions.java @@ -30,10 +30,10 @@ import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.branch.BranchGraphSynchronizer; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; public class BranchGraphUndoActions @@ -54,7 +54,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.MASTODON ); + super( KeyConfigScopes.MAMUT, KeyConfigContexts.MASTODON ); } @Override @@ -75,7 +75,7 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) * {@code redo()} methods. * @param branchGraphSync */ - public static void install( final Actions actions, final Model model, BranchGraphSynchronizer branchGraphSync ) + public static void install( final Actions actions, final Model model, final BranchGraphSynchronizer branchGraphSync ) { actions.runnableAction( () -> { model.undo(); diff --git a/src/main/java/org/mastodon/mamut/DumpInputConfig.java b/src/main/java/org/mastodon/mamut/DumpInputConfig.java index c03b21fb6..0de7bf7f9 100644 --- a/src/main/java/org/mastodon/mamut/DumpInputConfig.java +++ b/src/main/java/org/mastodon/mamut/DumpInputConfig.java @@ -40,8 +40,6 @@ import org.mastodon.ui.FocusActions; import org.mastodon.ui.HighlightBehaviours; import org.mastodon.ui.SelectionActions; -import org.mastodon.ui.keymap.CommandDescriptions; -import org.mastodon.ui.keymap.CommandDescriptionsBuilder; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.bdv.BigDataViewerActionsMamut; import org.mastodon.views.bdv.NavigationActionsDescriptions; @@ -57,6 +55,8 @@ import org.scijava.Context; import org.scijava.ui.behaviour.io.InputTriggerDescription; import org.scijava.ui.behaviour.io.InputTriggerDescriptionsBuilder; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionsBuilder; import org.scijava.ui.behaviour.io.yaml.YamlConfigIO; import bdv.ui.keymap.Keymap; diff --git a/src/main/java/org/mastodon/mamut/KeyConfigScopes.java b/src/main/java/org/mastodon/mamut/KeyConfigScopes.java new file mode 100644 index 000000000..b3c4d883a --- /dev/null +++ b/src/main/java/org/mastodon/mamut/KeyConfigScopes.java @@ -0,0 +1,44 @@ +/* + * #%L + * BigDataViewer core classes with minimal dependencies. + * %% + * Copyright (C) 2012 - 2022 BigDataViewer developers. + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ +package org.mastodon.mamut; + +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; + +/** + * The CommandDescription scope used for actions and behaviours defined in the + * Mamut app of Mastodon. + */ +public interface KeyConfigScopes +{ + /** + * The CommandDescription scope used for actions and behaviours defined in + * the Mamut app of Mastodon. + */ + CommandDescriptionProvider.Scope MAMUT = new CommandDescriptionProvider.Scope( "org.mastodon.mamut" ); +} diff --git a/src/main/java/org/mastodon/mamut/MainWindow.java b/src/main/java/org/mastodon/mamut/MainWindow.java index 2cd948244..b0ad892a2 100644 --- a/src/main/java/org/mastodon/mamut/MainWindow.java +++ b/src/main/java/org/mastodon/mamut/MainWindow.java @@ -72,9 +72,9 @@ import org.mastodon.mamut.views.trackscheme.MamutBranchViewTrackSchemeFactory; import org.mastodon.mamut.views.trackscheme.MamutViewTrackSchemeFactory; import org.mastodon.ui.keymap.KeyConfigContexts; -import org.mastodon.ui.keymap.Keymap; import org.mastodon.util.RunnableActionPair; +import bdv.ui.keymap.Keymap; import net.miginfocom.swing.MigLayout; public class MainWindow extends JFrame @@ -185,7 +185,7 @@ public void paintComponent( final Graphics g ) menubar = new JMenuBar(); setJMenuBar( menubar ); - final Keymap keymap = appModel.getKeymapManager().getForwardDefaultKeymap(); + final Keymap keymap = appModel.getKeymapManager().getForwardSelectedKeymap(); menu = new ViewMenu( menubar, keymap, KeyConfigContexts.MASTODON ); keymap.updateListeners().add( menu::updateKeymap ); addMenus( menu, projectActionMap ); diff --git a/src/main/java/org/mastodon/mamut/MamutActions.java b/src/main/java/org/mastodon/mamut/MamutActions.java index 3f2d57b5b..c1049c4f5 100644 --- a/src/main/java/org/mastodon/mamut/MamutActions.java +++ b/src/main/java/org/mastodon/mamut/MamutActions.java @@ -39,10 +39,10 @@ import org.mastodon.mamut.model.ModelGraph; import org.mastodon.mamut.model.Spot; import org.mastodon.model.SelectionModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedAction; import org.scijava.ui.behaviour.util.Actions; @@ -66,7 +66,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.MASTODON ); + super( KeyConfigScopes.MAMUT, KeyConfigContexts.MASTODON ); } @Override diff --git a/src/main/java/org/mastodon/mamut/MamutViews.java b/src/main/java/org/mastodon/mamut/MamutViews.java index 8cae30dca..b8e31fc36 100644 --- a/src/main/java/org/mastodon/mamut/MamutViews.java +++ b/src/main/java/org/mastodon/mamut/MamutViews.java @@ -43,9 +43,9 @@ import org.mastodon.app.ui.ViewMenuBuilder.MenuItem; import org.mastodon.mamut.views.MamutViewFactory; import org.mastodon.mamut.views.MamutViewI; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; /** * Manages a collection of view factories. @@ -104,7 +104,7 @@ public < T extends MamutViewI > MamutViewFactory< T > getFactory( final Class< T CommandDescriptionProvider getCommandDescriptions() { - return new CommandDescriptionProvider( KeyConfigContexts.MASTODON ) + return new CommandDescriptionProvider( KeyConfigScopes.MAMUT, KeyConfigContexts.MASTODON ) { @Override diff --git a/src/main/java/org/mastodon/mamut/PreferencesDialog.java b/src/main/java/org/mastodon/mamut/PreferencesDialog.java index b174187e3..758a85800 100644 --- a/src/main/java/org/mastodon/mamut/PreferencesDialog.java +++ b/src/main/java/org/mastodon/mamut/PreferencesDialog.java @@ -42,9 +42,9 @@ import org.mastodon.app.MastodonIcons; import org.mastodon.app.ui.CloseWindowActions; import org.mastodon.app.ui.SettingsPanel; -import org.mastodon.ui.keymap.Keymap; import org.scijava.ui.behaviour.util.Actions; +import bdv.ui.keymap.Keymap; import bdv.ui.settings.SettingsPage; public class PreferencesDialog extends JDialog diff --git a/src/main/java/org/mastodon/mamut/ProjectModel.java b/src/main/java/org/mastodon/mamut/ProjectModel.java index a5386d863..004b9c249 100644 --- a/src/main/java/org/mastodon/mamut/ProjectModel.java +++ b/src/main/java/org/mastodon/mamut/ProjectModel.java @@ -44,14 +44,15 @@ import org.mastodon.mamut.plugin.MamutPlugins; import org.mastodon.ui.SelectionActions; import org.mastodon.ui.keymap.KeyConfigContexts; -import org.mastodon.ui.keymap.Keymap; -import org.mastodon.ui.keymap.KeymapManager; +import org.mastodon.ui.keymap.MastodonKeymapManager; import org.mastodon.views.bdv.SharedBigDataViewerData; import org.scijava.Context; import org.scijava.listeners.Listeners; import org.scijava.ui.behaviour.KeyPressedManager; import org.scijava.ui.behaviour.util.Actions; +import bdv.ui.keymap.Keymap; +import bdv.ui.keymap.KeymapManager; import bdv.viewer.animate.MessageOverlayAnimator; /** @@ -82,7 +83,7 @@ public class ProjectModel extends MastodonAppModel< Model, Spot, Link > implemen private final MamutProject project; - public ProjectModel( + private ProjectModel( final Context context, final Model model, final SharedBigDataViewerData sharedBdvData, @@ -95,8 +96,8 @@ public ProjectModel( model, keyPressedManager, keymapManager, - new MamutPlugins( keymapManager.getForwardDefaultKeymap() ), - new Actions( keymapManager.getForwardDefaultKeymap().getConfig(), KeyConfigContexts.MASTODON ), + new MamutPlugins( keymapManager.getForwardSelectedKeymap() ), + new Actions( keymapManager.getForwardSelectedKeymap().getConfig(), KeyConfigContexts.MASTODON ), new String[] { KeyConfigContexts.MASTODON } ); this.context = context; @@ -106,7 +107,7 @@ public ProjectModel( this.minTimepoint = 0; this.maxTimepoint = sharedBdvData.getNumTimepoints() - 1; - final Keymap keymap = keymapManager.getForwardDefaultKeymap(); + final Keymap keymap = keymapManager.getForwardSelectedKeymap(); keymap.updateListeners().add( () -> { getProjectActions().updateKeyConfig( keymap.getConfig() ); getModelActions().updateKeyConfig( keymap.getConfig() ); @@ -207,4 +208,11 @@ public MamutProject getProject() { return project; } + + public static ProjectModel create( final Context context, final Model model, final SharedBigDataViewerData imageData, final MamutProject project ) + { + final KeyPressedManager keyPressedManager = new KeyPressedManager(); + final KeymapManager keymapManager = new MastodonKeymapManager( true ); + return new ProjectModel( context, model, imageData, keyPressedManager, keymapManager, project ); + } } diff --git a/src/main/java/org/mastodon/mamut/UndoActions.java b/src/main/java/org/mastodon/mamut/UndoActions.java index 13b77dfeb..53bfe545f 100644 --- a/src/main/java/org/mastodon/mamut/UndoActions.java +++ b/src/main/java/org/mastodon/mamut/UndoActions.java @@ -29,10 +29,10 @@ package org.mastodon.mamut; import org.mastodon.mamut.model.Model; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; public class UndoActions @@ -53,7 +53,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.MASTODON ); + super( KeyConfigScopes.MAMUT, KeyConfigContexts.MASTODON ); } @Override diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 2360fd723..6567cdecc 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -63,12 +63,7 @@ import org.mastodon.mamut.views.bdv.MamutViewBdv; import org.mastodon.model.tag.ui.TagSetDialog; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; -import org.mastodon.ui.keymap.CommandDescriptionsBuilder; import org.mastodon.ui.keymap.KeyConfigContexts; -import org.mastodon.ui.keymap.Keymap; -import org.mastodon.ui.keymap.KeymapManager; import org.mastodon.ui.keymap.KeymapSettingsPage; import org.mastodon.views.context.ContextChooser; import org.mastodon.views.context.ContextProvider; @@ -77,10 +72,15 @@ import org.scijava.Context; import org.scijava.listeners.Listeners; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionsBuilder; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.RunnableAction; import bdv.tools.ToggleDialogAction; +import bdv.ui.keymap.Keymap; +import bdv.ui.keymap.KeymapManager; import bdv.ui.settings.SettingsPage; import bdv.util.InvokeOnEDT; @@ -154,7 +154,7 @@ public WindowManager( final ProjectModel appModel ) final Context context = appModel.getContext(); final Model model = appModel.getModel(); final KeymapManager keymapManager = appModel.getKeymapManager(); - final Keymap keymap = keymapManager.getForwardDefaultKeymap(); + final Keymap keymap = keymapManager.getForwardSelectedKeymap(); final Actions projectActions = appModel.getProjectActions(); /* @@ -562,7 +562,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.MASTODON ); + super( KeyConfigScopes.MAMUT, KeyConfigContexts.MASTODON ); } @Override diff --git a/src/main/java/org/mastodon/mamut/io/ProjectActions.java b/src/main/java/org/mastodon/mamut/io/ProjectActions.java index 360645bcf..41ce4ad90 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectActions.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectActions.java @@ -3,12 +3,13 @@ import java.awt.Component; import java.awt.Frame; +import org.mastodon.mamut.KeyConfigScopes; import org.mastodon.mamut.ProjectModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.scijava.Context; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.RunnableAction; @@ -79,7 +80,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.MASTODON ); + super( KeyConfigScopes.MAMUT, KeyConfigContexts.MASTODON ); } @Override diff --git a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java index a568fb3ac..88adec294 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java @@ -27,14 +27,12 @@ import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.ui.keymap.KeymapManager; import org.mastodon.ui.util.ExtensionFileFilter; import org.mastodon.ui.util.FileChooser; import org.mastodon.ui.util.FileChooser.SelectionMode; import org.mastodon.util.DummySpimData; import org.mastodon.views.bdv.SharedBigDataViewerData; import org.scijava.Context; -import org.scijava.ui.behaviour.KeyPressedManager; import ij.IJ; import ij.ImagePlus; @@ -157,9 +155,7 @@ public static ProjectModel open( final MamutProject project, final Context conte { final SharedBigDataViewerData imageData = loadImageData( project, authorizeSubstituteDummyData ); final Model model = loadModel( project, context ); - final KeyPressedManager keyPressedManager = new KeyPressedManager(); - final KeymapManager keymapManager = new KeymapManager(); - final ProjectModel appModel = new ProjectModel( context, model, imageData, keyPressedManager, keymapManager, project ); + final ProjectModel appModel = ProjectModel.create( context, model, imageData, project ); if ( restoreGUIState ) loadGUI( project, appModel.getWindowManager() ); diff --git a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java index a6cc383b6..056705368 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java @@ -39,14 +39,12 @@ import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; import org.mastodon.mamut.views.MamutViewFactory; -import org.mastodon.ui.keymap.KeymapManager; import org.mastodon.ui.util.ExtensionFileFilter; import org.mastodon.ui.util.FileChooser; import org.mastodon.ui.util.FileChooser.SelectionMode; import org.mastodon.util.BDVImagePlusExporter; import org.mastodon.views.bdv.SharedBigDataViewerData; import org.scijava.Context; -import org.scijava.ui.behaviour.KeyPressedManager; import ij.gui.ImageWindow; @@ -361,9 +359,7 @@ public void windowClosing( final java.awt.event.WindowEvent e ) // And now the weird part: we reopen the project we just created. final Context context = appModel.getContext(); final Model model = appModel.getModel(); - final KeyPressedManager keyPressedManager = new KeyPressedManager(); - final KeymapManager keymapManager = new KeymapManager(); - final ProjectModel nmam = new ProjectModel( context, model, sbdv, keyPressedManager, keymapManager, np ); + final ProjectModel nmam = ProjectModel.create( context, model, sbdv, np ); // Close the old one. appModel.close(); diff --git a/src/main/java/org/mastodon/mamut/plugin/MamutPlugins.java b/src/main/java/org/mastodon/mamut/plugin/MamutPlugins.java index 6a17150d2..e1e15ee9b 100644 --- a/src/main/java/org/mastodon/mamut/plugin/MamutPlugins.java +++ b/src/main/java/org/mastodon/mamut/plugin/MamutPlugins.java @@ -30,7 +30,8 @@ import org.mastodon.app.plugin.MastodonPlugins; import org.mastodon.mamut.ProjectModel; -import org.mastodon.ui.keymap.Keymap; + +import bdv.ui.keymap.Keymap; public class MamutPlugins extends MastodonPlugins< MamutPlugin, ProjectModel > { diff --git a/src/main/java/org/mastodon/mamut/plugin/MamutTestPlugin.java b/src/main/java/org/mastodon/mamut/plugin/MamutTestPlugin.java index b2e6fe406..c140ff750 100644 --- a/src/main/java/org/mastodon/mamut/plugin/MamutTestPlugin.java +++ b/src/main/java/org/mastodon/mamut/plugin/MamutTestPlugin.java @@ -35,11 +35,12 @@ import java.util.Map; import org.mastodon.app.ui.ViewMenuBuilder; -import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.KeyConfigScopes; import org.mastodon.mamut.MamutMenuBuilder; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; +import org.mastodon.mamut.ProjectModel; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedAction; import org.scijava.ui.behaviour.util.Actions; @@ -58,7 +59,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.MASTODON ); + super( KeyConfigScopes.MAMUT, KeyConfigContexts.MASTODON ); } @Override diff --git a/src/main/java/org/mastodon/mamut/views/MamutBranchView.java b/src/main/java/org/mastodon/mamut/views/MamutBranchView.java index 1fa09a08f..1cbf0280f 100644 --- a/src/main/java/org/mastodon/mamut/views/MamutBranchView.java +++ b/src/main/java/org/mastodon/mamut/views/MamutBranchView.java @@ -79,13 +79,14 @@ import org.mastodon.ui.coloring.GraphColorGeneratorAdapter; import org.mastodon.ui.coloring.TagSetGraphColorGenerator; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; -import org.mastodon.ui.keymap.Keymap; -import org.mastodon.ui.keymap.Keymap.UpdateListener; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.Behaviours; import org.scijava.ui.behaviour.util.WrappedActionMap; import org.scijava.ui.behaviour.util.WrappedInputMap; +import bdv.ui.keymap.Keymap; +import bdv.ui.keymap.Keymap.UpdateListener; + /** * Mother class for views that display the branch graph of the model. * diff --git a/src/main/java/org/mastodon/model/tag/ui/TagSetDialog.java b/src/main/java/org/mastodon/model/tag/ui/TagSetDialog.java index 3b7a26053..4de90e309 100644 --- a/src/main/java/org/mastodon/model/tag/ui/TagSetDialog.java +++ b/src/main/java/org/mastodon/model/tag/ui/TagSetDialog.java @@ -47,10 +47,10 @@ import org.mastodon.model.tag.TagSetModel; import org.mastodon.model.tag.TagSetStructure; import org.mastodon.model.tag.TagSetStructure.TagSet; -import org.mastodon.ui.keymap.Keymap; import org.mastodon.undo.UndoPointMarker; import org.scijava.ui.behaviour.util.Actions; +import bdv.ui.keymap.Keymap; import bdv.ui.settings.SimpleSettingsPage; import bdv.ui.settings.SingleSettingsPanel; diff --git a/src/main/java/org/mastodon/ui/EditTagActions.java b/src/main/java/org/mastodon/ui/EditTagActions.java index 14ce04341..9255ff0c4 100644 --- a/src/main/java/org/mastodon/ui/EditTagActions.java +++ b/src/main/java/org/mastodon/ui/EditTagActions.java @@ -55,13 +55,14 @@ import org.mastodon.model.tag.TagSetStructure; import org.mastodon.model.tag.TagSetStructure.Tag; import org.mastodon.model.tag.TagSetStructure.TagSet; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.ui.util.NumberListeners; import org.mastodon.undo.UndoPointMarker; import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.InputTriggerMap; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.InputActionBindings; import org.scijava.ui.behaviour.util.TriggerBehaviourBindings; @@ -96,7 +97,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.TRACKSCHEME ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.TRACKSCHEME ); } @Override diff --git a/src/main/java/org/mastodon/ui/FocusActions.java b/src/main/java/org/mastodon/ui/FocusActions.java index 6a18da117..72e74f4fd 100644 --- a/src/main/java/org/mastodon/ui/FocusActions.java +++ b/src/main/java/org/mastodon/ui/FocusActions.java @@ -38,11 +38,12 @@ import org.mastodon.graph.Vertex; import org.mastodon.model.FocusModel; import org.mastodon.model.SelectionModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.views.trackscheme.display.TrackSchemeNavigationActions.NavigatorEtiquette; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.RunnableAction; @@ -123,7 +124,8 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.BIGDATAVIEWER, KeyConfigContexts.TRACKSCHEME ); + // TODO grapher as well? + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER, KeyConfigContexts.TRACKSCHEME ); } @Override diff --git a/src/main/java/org/mastodon/ui/HighlightBehaviours.java b/src/main/java/org/mastodon/ui/HighlightBehaviours.java index d44d2c08f..40500a6f2 100644 --- a/src/main/java/org/mastodon/ui/HighlightBehaviours.java +++ b/src/main/java/org/mastodon/ui/HighlightBehaviours.java @@ -35,12 +35,13 @@ import org.mastodon.graph.GraphChangeNotifier; import org.mastodon.graph.Vertex; import org.mastodon.model.HighlightModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.undo.UndoPointMarker; import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.ClickBehaviour; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedBehaviour; import org.scijava.ui.behaviour.util.Behaviours; @@ -73,7 +74,8 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.BIGDATAVIEWER, KeyConfigContexts.TRACKSCHEME ); + // TODO Grapher as well? + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER, KeyConfigContexts.TRACKSCHEME ); } @Override diff --git a/src/main/java/org/mastodon/ui/SelectionActions.java b/src/main/java/org/mastodon/ui/SelectionActions.java index a7175753e..f44a40f9b 100644 --- a/src/main/java/org/mastodon/ui/SelectionActions.java +++ b/src/main/java/org/mastodon/ui/SelectionActions.java @@ -43,11 +43,12 @@ import org.mastodon.graph.algorithm.traversal.GraphSearch.SearchDirection; import org.mastodon.graph.algorithm.traversal.SearchListener; import org.mastodon.model.SelectionModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.undo.UndoPointMarker; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedAction; import org.scijava.ui.behaviour.util.Actions; @@ -101,7 +102,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.MASTODON ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.MASTODON ); } @Override diff --git a/src/main/java/org/mastodon/ui/keymap/CommandDescriptions.java b/src/main/java/org/mastodon/ui/keymap/CommandDescriptions.java deleted file mode 100644 index b46264db4..000000000 --- a/src/main/java/org/mastodon/ui/keymap/CommandDescriptions.java +++ /dev/null @@ -1,162 +0,0 @@ -/*- - * #%L - * Mastodon - * %% - * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ -package org.mastodon.ui.keymap; - -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.Map; - -import org.scijava.ui.behaviour.InputTrigger; -import org.scijava.ui.behaviour.io.InputTriggerConfig; -import org.scijava.ui.behaviour.io.gui.Command; -import org.scijava.ui.behaviour.io.gui.VisualEditorPanel; - -/** - * A map linking {@link Command} (action name and context name) to its - * {@link DescriptionAndTriggers} (textual description and default triggers of - * the command). - *

    - * New entries are added using {@link #add(String, String[], String)}. This - * specifies only the action name of the {@code Command}. The context of the - * {@code Command} is the current context of this - * {@code CommandDescriptions}. The current context is changed by - * {@link #setKeyconfigContext(String)}, and then used for subsequently added - * entries. - */ -public final class CommandDescriptions -{ - public static final class DescriptionAndTriggers - { - private final String description; - - private final String[] defaultTriggers; - - public DescriptionAndTriggers( final String description, final String[] defaultTriggers ) - { - this.description = description; - this.defaultTriggers = defaultTriggers; - } - } - - private final Map< Command, DescriptionAndTriggers > descriptions = new LinkedHashMap<>(); - - private String context; - - /** - * Adds a new entry, linking a {@code Command} to textual description and - * default triggers. - * - * @param name - * name of the {@code Action} or {@code Behaviour}. Together with - * the current context name (see - * {@link #setKeyconfigContext(String)}) this specifies a - * {@link Command}. - * @param defaultTriggers - * default {@link InputTrigger}s for the command. - * @param description - * textual description of the command (for displaying in UI). - */ - public void add( final String name, final String[] defaultTriggers, final String description ) - { - final Command c = new Command( name, context ); - final DescriptionAndTriggers cd = new DescriptionAndTriggers( description, defaultTriggers ); - descriptions.put( c, cd ); - } - - /** - * Sets the current context. This context name is then used for subsequently - * {@link #add(String, String[], String) added} commands. - * - * @param context - * the context name. - */ - public void setKeyconfigContext( final String context ) - { - this.context = context; - } - - /** - * Builds a map from {@link Command} to textual description. This is for - * making a keyconfig {@link VisualEditorPanel}. - * - * @return a new map. - */ - public Map< Command, String > createCommandDescriptionsMap() - { - final Map< Command, String > map = new LinkedHashMap<>(); - descriptions.forEach( ( c, d ) -> map.put( c, d.description ) ); - return map; - } - - /** - * Builds a {@link InputTriggerConfig} with all commands and their default - * triggers. Commands that have no specified default triggers will have - * trigger {@code "not mapped"}. - * - * @return a new {@link InputTriggerConfig}. - */ - public InputTriggerConfig createDefaultKeyconfig() - { - final InputTriggerConfig config = new InputTriggerConfig(); - descriptions.forEach( ( c, d ) -> { - final String name = c.getName(); - final String context = c.getContext(); - final String[] triggers = d.defaultTriggers; - if ( triggers == null || triggers.length == 0 ) - config.add( "not mapped", name, context ); - else - Arrays.stream( triggers ).forEachOrdered( t -> config.add( t, name, context ) ); - } ); - return config; - } - - /** - * For commands that are not yet defined in {@code config}, add them with - * their default triggers. Commands that have no specified default triggers - * will have trigger {@code "not mapped"}. - * - * @param config - * the input trigger config to add commands to. - */ - public void augmentInputTriggerConfig( final InputTriggerConfig config ) - { - descriptions.forEach( ( c, d ) -> { - final String name = c.getName(); - final String context = c.getContext(); - if ( config.getInputs( name, context ).isEmpty() ) - { - final String[] triggers = d.defaultTriggers; - if ( triggers == null || triggers.length == 0 ) - config.add( "not mapped", name, context ); - else - Arrays.stream( triggers ).forEachOrdered( t -> config.add( t, name, context ) ); - } - } ); - } -} diff --git a/src/main/java/org/mastodon/ui/keymap/CommandDescriptionsBuilder.java b/src/main/java/org/mastodon/ui/keymap/CommandDescriptionsBuilder.java deleted file mode 100644 index 2aa3faa6f..000000000 --- a/src/main/java/org/mastodon/ui/keymap/CommandDescriptionsBuilder.java +++ /dev/null @@ -1,162 +0,0 @@ -/*- - * #%L - * Mastodon - * %% - * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ -package org.mastodon.ui.keymap; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.scijava.AbstractContextual; -import org.scijava.plugin.Parameter; -import org.scijava.plugin.PluginService; - -/** - * Helper class to populate {@link CommandDescriptions} from - * {@link CommandDescriptionProvider}s. - */ -public class CommandDescriptionsBuilder extends AbstractContextual -{ - @Parameter - private PluginService pluginService; - - private static class ProviderAndContext - { - final CommandDescriptionProvider provider; - - final String context; - - public ProviderAndContext( final CommandDescriptionProvider provider, final String context ) - { - this.provider = provider; - this.context = context; - } - } - - private final List< ProviderAndContext > registered = new ArrayList<>(); - - /** - * Manually adds a {@code provider} in a specified {@code context}. For - * example, this is useful for adding stuff in a specific order, for - * building nice {@code keyconfig.yaml} files. - * - * @param provider - * the provider to add. - * @param context - * the context to add to. - */ - public void addManually( final CommandDescriptionProvider provider, final String context ) - { - for ( final ProviderAndContext pac : registered ) - { - if ( pac.context.equals( context ) && pac.provider.getClass().equals( provider.getClass() ) ) - System.err.println( "Potential problem: a provider of class " + provider.getClass() - + " is already registered for context \"" + context + "\"." ); - } - registered.add( new ProviderAndContext( provider, context ) ); - } - - /** - * Manually add a {@code provider} in the specified {@code contexts}. For - * example, this is useful for adding stuff in a specific order, for - * building nice {@code keyconfig.yaml} files. - * - * @param provider - * the provider to add. - * @param contexts - * the list of contexts to add to. - */ - public void addManually( final CommandDescriptionProvider provider, final String... contexts ) - { - Arrays.stream( contexts ).forEachOrdered( context -> addManually( provider, context ) ); - } - - /** - * Adds all {@link CommandDescriptionProvider}s on the plugin index, with - * their respective {@link CommandDescriptionProvider#getExpectedContexts() - * expected contexts}. - */ - public void discoverProviders() - { - final List< CommandDescriptionProvider > providers = - pluginService.createInstancesOfType( CommandDescriptionProvider.class ); - for ( final CommandDescriptionProvider provider : providers ) - for ( final String context : provider.getExpectedContexts() ) - registered.add( new ProviderAndContext( provider, context ) ); - } - - /** - * Debugging helper. Checks whether all manually added providers are - * automatically discovered, and vice versa. Prints warnings to stderr - * otherwise. - */ - public void verifyManuallyAdded() - { - final List< ProviderAndContext > discovered = new ArrayList<>(); - final List< CommandDescriptionProvider > providers = - pluginService.createInstancesOfType( CommandDescriptionProvider.class ); - for ( final CommandDescriptionProvider provider : providers ) - for ( final String context : provider.getExpectedContexts() ) - discovered.add( new ProviderAndContext( provider, context ) ); - - // Can all registered providers be discovered? - boolean anyFailed = false; - A: for ( final ProviderAndContext r : registered ) - { - for ( final ProviderAndContext d : discovered ) - if ( r.context.equals( d.context ) && r.provider.getClass().equals( d.provider.getClass() ) ) - continue A; - System.err.println( r.provider.getClass() + " (\"" + r.context - + "\") is manually registered, but could not be discovered." ); - anyFailed = true; - } - if ( anyFailed ) - System.err.println(); - - // Were all discovered providers manually added? - A: for ( final ProviderAndContext d : discovered ) - { - for ( final ProviderAndContext r : registered ) - if ( r.context.equals( d.context ) && r.provider.getClass().equals( d.provider.getClass() ) ) - continue A; - System.err.println( d.provider.getClass() + " (\"" + d.context - + "\") was discovered, but was not manually registered." ); - } - } - - public CommandDescriptions build() - { - final CommandDescriptions descriptions = new CommandDescriptions(); - for ( final ProviderAndContext pac : registered ) - { - descriptions.setKeyconfigContext( pac.context ); - pac.provider.getCommandDescriptions( descriptions ); - } - return descriptions; - } -} diff --git a/src/main/java/org/mastodon/ui/keymap/KeyConfigContexts.java b/src/main/java/org/mastodon/ui/keymap/KeyConfigContexts.java index 9d572b276..8edf8c10d 100644 --- a/src/main/java/org/mastodon/ui/keymap/KeyConfigContexts.java +++ b/src/main/java/org/mastodon/ui/keymap/KeyConfigContexts.java @@ -31,7 +31,6 @@ /** * Constants that specify to what context an action or a behaviour applies. */ -// TODO move to somewhere in mamut package public interface KeyConfigContexts { /** diff --git a/src/main/java/org/mastodon/ui/keymap/CommandDescriptionProvider.java b/src/main/java/org/mastodon/ui/keymap/KeyConfigScopes.java similarity index 61% rename from src/main/java/org/mastodon/ui/keymap/CommandDescriptionProvider.java rename to src/main/java/org/mastodon/ui/keymap/KeyConfigScopes.java index 547f8a678..652f42e7f 100644 --- a/src/main/java/org/mastodon/ui/keymap/CommandDescriptionProvider.java +++ b/src/main/java/org/mastodon/ui/keymap/KeyConfigScopes.java @@ -1,8 +1,8 @@ -/*- +/* * #%L - * Mastodon + * BigDataViewer core classes with minimal dependencies. * %% - * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez + * Copyright (C) 2012 - 2022 BigDataViewer developers. * %% * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -28,31 +28,17 @@ */ package org.mastodon.ui.keymap; -import org.scijava.plugin.SciJavaPlugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; /** - * Implementations of this interface, annotated with {@code @Plugin}, are - * discovered for automatically adding actions/behaviours to a - * {@link CommandDescriptions} map. - *

    - * (This allows to discover Plugin shortcuts which cannot be hardwired into the - * default keymap.) - * - * TODO: remove and replace by the BDV equivalent. + * The CommandDescription scope used for actions and behaviours defined in the + * Mastodon apps. */ -public abstract class CommandDescriptionProvider implements SciJavaPlugin +public interface KeyConfigScopes { - private final String[] expectedContexts; - - protected CommandDescriptionProvider( final String... expectedContexts ) - { - this.expectedContexts = expectedContexts; - } - - public String[] getExpectedContexts() - { - return expectedContexts; - } - - public abstract void getCommandDescriptions( final CommandDescriptions descriptions ); + /** + * The CommandDescription scope used for actions and behaviours defined in + * Mastodon apps. + */ + CommandDescriptionProvider.Scope MASTODON = new CommandDescriptionProvider.Scope( "org.mastodon" ); } diff --git a/src/main/java/org/mastodon/ui/keymap/Keymap.java b/src/main/java/org/mastodon/ui/keymap/Keymap.java deleted file mode 100644 index a90638da1..000000000 --- a/src/main/java/org/mastodon/ui/keymap/Keymap.java +++ /dev/null @@ -1,138 +0,0 @@ -/*- - * #%L - * Mastodon - * %% - * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ -package org.mastodon.ui.keymap; - -import java.util.Objects; - -import org.scijava.listeners.Listeners; -import org.scijava.ui.behaviour.io.InputTriggerConfig; - -import bdv.ui.settings.style.Style; - -public class Keymap implements Style< Keymap > -{ - /** - * The name of this keymap. - */ - private String name; - - private final InputTriggerConfig config; - - public interface UpdateListener - { - public void keymapChanged(); - } - - private final Listeners.List< UpdateListener > updateListeners; - - public Keymap( final String name, final InputTriggerConfig config ) - { - this.name = name; - this.config = config; - this.updateListeners = new Listeners.SynchronizedList<>(); - } - - public Keymap() - { - this( "", new InputTriggerConfig() ); - } - - /** - * Returns a new style instance, copied from this style. - * - * @param name - * the name for the copied style. - * @return a new style instance. - */ - @Override - public Keymap copy( final String name ) - { - final Keymap newStyle = new Keymap(); - newStyle.set( this ); - if ( name != null ) - newStyle.setName( name ); - return newStyle; - } - - @Override - public Keymap copy() - { - return copy( null ); - } - - public synchronized void set( final Keymap style ) - { - this.name = style.name; - this.config.set( style.config ); - notifyListeners(); - } - - private void notifyListeners() - { - for ( final UpdateListener l : updateListeners.list ) - l.keymapChanged(); - } - - public Listeners< UpdateListener > updateListeners() - { - return updateListeners; - } - - public InputTriggerConfig getConfig() - { - return config; - } - - /** - * Returns the name of this {@link Keymap}. - * - * @return the name. - */ - @Override - public String getName() - { - return name; - } - - /** - * Sets the name of this {@link Keymap}. - * - * @param name - * the name to set. - */ - @Override - public synchronized void setName( final String name ) - { - if ( !Objects.equals( this.name, name ) ) - { - this.name = name; - // notifyListeners(); // TODO? - } - } -} diff --git a/src/main/java/org/mastodon/ui/keymap/KeymapManager.java b/src/main/java/org/mastodon/ui/keymap/KeymapManager.java deleted file mode 100644 index 255b347d8..000000000 --- a/src/main/java/org/mastodon/ui/keymap/KeymapManager.java +++ /dev/null @@ -1,239 +0,0 @@ -/*- - * #%L - * Mastodon - * %% - * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ -package org.mastodon.ui.keymap; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import org.scijava.ui.behaviour.io.InputTriggerConfig; -import org.scijava.ui.behaviour.io.InputTriggerDescription; -import org.scijava.ui.behaviour.io.InputTriggerDescriptionsBuilder; -import org.scijava.ui.behaviour.io.yaml.YamlConfigIO; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.LoaderOptions; -import org.yaml.snakeyaml.TypeDescription; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.Constructor; -import org.yaml.snakeyaml.nodes.Tag; -import org.yaml.snakeyaml.representer.Representer; - -import bdv.ui.settings.style.AbstractStyleManager; - -/** - * Manages a collection of {@link Keymap}. - *

    - * Provides de/serialization of user-defined keymaps. - * - * @author Tobias Pietzsch - */ -public class KeymapManager extends AbstractStyleManager< KeymapManager, Keymap > -{ - private static final String KEYMAPS_PATH = System.getProperty( "user.home" ) + "/.mastodon/keymaps/"; - - /** - * A {@code Keymap} that has the same properties as the default - * keymap. In contrast to defaultStyle this will always - * refer to the same object, so a consumers can just use this one - * RenderSettings to listen for changes and for painting. - */ - private final Keymap forwardDefaultKeymap; - - public KeymapManager() - { - this( true ); - } - - public KeymapManager( final boolean loadStyles ) - { - forwardDefaultKeymap = new Keymap(); - if ( loadStyles ) - loadStyles(); - } - - @Override - protected List< Keymap > loadBuiltinStyles() - { - try - { - synchronized ( KeymapManager.class ) - { - if ( loadedBuiltinStyles == null ) - loadedBuiltinStyles = Arrays.asList( - loadBuiltinStyle( "Default", "keyconf_mastodon.yaml" ), - loadBuiltinStyle( "All BDV keys", "keyconf_fullbdv.yaml" ) ); - } - return loadedBuiltinStyles; - } - catch ( final IOException e ) - { - throw new RuntimeException( e ); - } - } - - private static List< Keymap > loadedBuiltinStyles; - - private static Keymap loadBuiltinStyle( final String name, final String filename ) throws IOException - { - final Reader reader = new InputStreamReader( KeymapManager.class.getResourceAsStream( filename ) ); - final InputTriggerConfig config = new InputTriggerConfig( YamlConfigIO.read( reader ) ); - reader.close(); - return new Keymap( name, config ); - } - - @Override - public synchronized void setSelectedStyle( final Keymap keymap ) - { - super.setSelectedStyle( keymap ); - forwardDefaultKeymap.set( selectedStyle ); - } - - /** - * Returns a final {@link Keymap} instance that always has the same - * properties as the default keymap. - * - * @return a keymap instance that always has the same properties as the default keymap. - */ - public Keymap getForwardDefaultKeymap() - { - return forwardDefaultKeymap; - } - - public void loadStyles() - { - loadStyles( KEYMAPS_PATH ); - } - - public void loadStyles( final String directory ) - { - userStyles.clear(); - final Set< String > names = builtinStyles.stream().map( Keymap::getName ).collect( Collectors.toSet() ); - Keymap defaultStyle = builtinStyles.get( 0 ); - try - { - String filename = KEYMAPS_PATH + "/keymaps.yaml"; - - KeymapsListIO keymapsList = null; - try - { - final FileReader input = new FileReader( filename ); - keymapsList = createYaml().loadAs( input, KeymapsListIO.class ); - input.close(); - } - catch ( final FileNotFoundException e ) - { - System.out.println( "Keymap list file " + filename + " not found. Using builtin styles." ); - } - - if ( keymapsList != null ) - { - for ( final Map.Entry< String, String > entry : keymapsList.getFileNameToKeymapName().entrySet() ) - { - filename = KEYMAPS_PATH + "/" + entry.getKey(); - try - { - final String name = entry.getValue(); - final InputTriggerConfig config = new InputTriggerConfig( YamlConfigIO.read( filename ) ); - // sanity check: style names must be unique - if ( names.add( name ) ) - userStyles.add( new Keymap( name, config ) ); - else - System.out.println( "Discarded style with duplicate name \"" + name + "\"." ); - } - catch ( final FileNotFoundException e ) - { - System.out.println( "Keymap file " + filename + " not found. Skipping." ); - } - } - - defaultStyle = styleForName( keymapsList.defaultKeymapName ).orElse( defaultStyle ); - } - } - catch ( final IOException e ) - { - e.printStackTrace(); - } - setSelectedStyle( defaultStyle ); - } - - @Override - public void saveStyles() - { - saveStyles( KEYMAPS_PATH ); - } - - public void saveStyles( final String directory ) - { - try - { - new File( directory ).mkdirs(); - - final KeymapsListIO keymapsList = new KeymapsListIO( - selectedStyle.getName(), - userStyles.stream().map( Keymap::getName ).collect( Collectors.toList() ) ); - - String filename = KEYMAPS_PATH + "/keymaps.yaml"; - final FileWriter output = new FileWriter( filename ); - createYaml().dump( keymapsList, output ); - output.close(); - - for ( final Keymap keymap : userStyles ) - { - filename = KEYMAPS_PATH + "/" + keymapsList.keymapNameToFileName.get( keymap.getName() ); - final List< InputTriggerDescription > descriptions = - new InputTriggerDescriptionsBuilder( keymap.getConfig() ).getDescriptions(); - YamlConfigIO.write( descriptions, filename ); - } - } - catch ( final IOException e ) - { - e.printStackTrace(); - } - } - - private static Yaml createYaml() - { - final DumperOptions dumperOptions = new DumperOptions(); - dumperOptions.setDefaultFlowStyle( DumperOptions.FlowStyle.BLOCK ); - final Representer representer = new Representer( dumperOptions ); - representer.addClassTag( KeymapsListIO.class, new Tag( "!keymapslist" ) ); - final Constructor constructor = new Constructor( new LoaderOptions() ); - constructor.addTypeDescription( new TypeDescription( KeymapsListIO.class, "!keymapslist" ) ); - return new Yaml( constructor, representer, dumperOptions ); - } -} diff --git a/src/main/java/org/mastodon/ui/keymap/KeymapSettingsPage.java b/src/main/java/org/mastodon/ui/keymap/KeymapSettingsPage.java index a040bc0bf..4d576caac 100644 --- a/src/main/java/org/mastodon/ui/keymap/KeymapSettingsPage.java +++ b/src/main/java/org/mastodon/ui/keymap/KeymapSettingsPage.java @@ -40,8 +40,11 @@ import org.mastodon.views.bdv.NavigationActionsDescriptions; import org.scijava.listeners.Listeners; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.io.gui.VisualEditorPanel; +import bdv.ui.keymap.Keymap; +import bdv.ui.keymap.KeymapManager; import bdv.ui.settings.ModificationListener; import bdv.ui.settings.SelectAndEditProfileSettingsPage; import bdv.ui.settings.SettingsPanel; @@ -65,7 +68,7 @@ public KeymapSettingsPage( final String treePath, final KeymapManager styleManag { super( treePath, - new StyleProfileManager<>( styleManager, new KeymapManager( false ) ), + new StyleProfileManager<>( styleManager, new MastodonKeymapManager() ), new KeymapProfileEditPanel( styleManager.getSelectedStyle(), commandDescriptions ) ); } @@ -133,7 +136,7 @@ public JPanel getJPanel() public static void main( final String[] args ) { - final KeymapManager styleManager = new KeymapManager(); + final KeymapManager styleManager = new MastodonKeymapManager(); final SettingsPanel settings = new SettingsPanel(); diff --git a/src/main/java/org/mastodon/ui/keymap/MastodonKeymapManager.java b/src/main/java/org/mastodon/ui/keymap/MastodonKeymapManager.java new file mode 100644 index 000000000..7e3ad2454 --- /dev/null +++ b/src/main/java/org/mastodon/ui/keymap/MastodonKeymapManager.java @@ -0,0 +1,62 @@ +package org.mastodon.ui.keymap; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.List; + +import org.scijava.ui.behaviour.io.InputTriggerConfig; +import org.scijava.ui.behaviour.io.yaml.YamlConfigIO; + +import bdv.ui.keymap.Keymap; +import bdv.ui.keymap.KeymapManager; + +/** + * Extends {@link KeymapManager} so that we can load the builtin keymaps for + * Mastodon, and save keymaps in the Mastodon folder. + */ +public class MastodonKeymapManager extends KeymapManager +{ + + private static final String CONFIG_DIR = System.getProperty( "user.home" ) + "/.mastodon/"; + + private static List< Keymap > loadedBuiltinStyles = null; + + public MastodonKeymapManager() + { + super(); + } + + public MastodonKeymapManager( final boolean loadStyles ) + { + super( CONFIG_DIR ); + } + + @Override + protected List< Keymap > loadBuiltinStyles() + { + try + { + synchronized ( KeymapManager.class ) + { + if ( loadedBuiltinStyles == null ) + loadedBuiltinStyles = Arrays.asList( + loadBuiltinStyle( "Default", "keyconf_mastodon.yaml" ), + loadBuiltinStyle( "All BDV keys", "keyconf_fullbdv.yaml" ) ); + return loadedBuiltinStyles; + } + } + catch ( final IOException e ) + { + throw new RuntimeException( e ); + } + } + + private static Keymap loadBuiltinStyle( final String name, final String filename ) throws IOException + { + final InputStreamReader reader = new InputStreamReader( MastodonKeymapManager.class.getResourceAsStream( filename ) ); + final InputTriggerConfig config = new InputTriggerConfig( YamlConfigIO.read( reader ) ); + reader.close(); + return new Keymap( name, config ); + } +} diff --git a/src/main/java/org/mastodon/views/bdv/BigDataViewerActionsMamut.java b/src/main/java/org/mastodon/views/bdv/BigDataViewerActionsMamut.java index b62dc7b08..a58009bc9 100644 --- a/src/main/java/org/mastodon/views/bdv/BigDataViewerActionsMamut.java +++ b/src/main/java/org/mastodon/views/bdv/BigDataViewerActionsMamut.java @@ -43,10 +43,11 @@ import static bdv.BigDataViewerActions.SET_BOOKMARK; import static bdv.BigDataViewerActions.SET_BOOKMARK_KEYS; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.ui.keymap.KeyConfigContexts; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; import bdv.BigDataViewerActions; @@ -61,7 +62,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.BIGDATAVIEWER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER ); } @Override diff --git a/src/main/java/org/mastodon/views/bdv/NavigationActionsDescriptions.java b/src/main/java/org/mastodon/views/bdv/NavigationActionsDescriptions.java index f7c55e174..9443d59b1 100644 --- a/src/main/java/org/mastodon/views/bdv/NavigationActionsDescriptions.java +++ b/src/main/java/org/mastodon/views/bdv/NavigationActionsDescriptions.java @@ -28,12 +28,6 @@ */ package org.mastodon.views.bdv; -import java.util.stream.IntStream; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; -import org.mastodon.ui.keymap.KeyConfigContexts; -import org.scijava.plugin.Plugin; - import static bdv.viewer.NavigationActions.ALIGN_XY_PLANE; import static bdv.viewer.NavigationActions.ALIGN_XY_PLANE_KEYS; import static bdv.viewer.NavigationActions.ALIGN_XZ_PLANE; @@ -55,6 +49,14 @@ import static bdv.viewer.NavigationActions.TOGGLE_SOURCE_VISIBILITY; import static bdv.viewer.NavigationActions.TOGGLE_SOURCE_VISIBILITY_KEYS_FORMAT; +import java.util.stream.IntStream; + +import org.mastodon.ui.keymap.KeyConfigScopes; +import org.mastodon.ui.keymap.KeyConfigContexts; +import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; + /* * Command descriptions for all commands provided by {@link NavigationActions} */ @@ -63,7 +65,7 @@ public class NavigationActionsDescriptions extends CommandDescriptionProvider { public NavigationActionsDescriptions() { - super( KeyConfigContexts.BIGDATAVIEWER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER ); } @Override diff --git a/src/main/java/org/mastodon/views/bdv/TransformEventHandler2DDescriptions.java b/src/main/java/org/mastodon/views/bdv/TransformEventHandler2DDescriptions.java index 40a5aff84..bfca626d4 100644 --- a/src/main/java/org/mastodon/views/bdv/TransformEventHandler2DDescriptions.java +++ b/src/main/java/org/mastodon/views/bdv/TransformEventHandler2DDescriptions.java @@ -28,11 +28,13 @@ */ package org.mastodon.views.bdv; -import bdv.TransformEventHandler2D; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.ui.keymap.KeyConfigContexts; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; + +import bdv.TransformEventHandler2D; /* * Command descriptions for all commands provided by {@link TransformEventHandler2D} @@ -42,7 +44,7 @@ public class TransformEventHandler2DDescriptions extends CommandDescriptionProvi { public TransformEventHandler2DDescriptions() { - super( KeyConfigContexts.BIGDATAVIEWER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER ); } @Override diff --git a/src/main/java/org/mastodon/views/bdv/TransformEventHandler3DDescriptions.java b/src/main/java/org/mastodon/views/bdv/TransformEventHandler3DDescriptions.java index 1539321f2..f144993e8 100644 --- a/src/main/java/org/mastodon/views/bdv/TransformEventHandler3DDescriptions.java +++ b/src/main/java/org/mastodon/views/bdv/TransformEventHandler3DDescriptions.java @@ -28,11 +28,13 @@ */ package org.mastodon.views.bdv; -import bdv.TransformEventHandler3D; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.ui.keymap.KeyConfigContexts; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; + +import bdv.TransformEventHandler3D; /* * Command descriptions for all commands provided by {@link TransformEventHandler3D} @@ -42,7 +44,7 @@ public class TransformEventHandler3DDescriptions extends CommandDescriptionProvi { public TransformEventHandler3DDescriptions() { - super( KeyConfigContexts.BIGDATAVIEWER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER ); } @Override diff --git a/src/main/java/org/mastodon/views/bdv/export/RecordMaxProjectionMovieDialog.java b/src/main/java/org/mastodon/views/bdv/export/RecordMaxProjectionMovieDialog.java index 27f58f452..8aef1460e 100644 --- a/src/main/java/org/mastodon/views/bdv/export/RecordMaxProjectionMovieDialog.java +++ b/src/main/java/org/mastodon/views/bdv/export/RecordMaxProjectionMovieDialog.java @@ -64,11 +64,8 @@ import org.mastodon.app.MastodonIcons; import org.mastodon.ui.coloring.ColorBarOverlay; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; -import org.mastodon.ui.keymap.Keymap; -import org.mastodon.ui.keymap.Keymap.UpdateListener; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.ui.util.FileChooser; import org.mastodon.ui.util.FileChooser.DialogType; import org.mastodon.ui.util.FileChooser.SelectionMode; @@ -76,10 +73,14 @@ import org.mastodon.views.bdv.overlay.OverlayGraphRenderer; import org.scijava.plugin.Plugin; import org.scijava.prefs.DefaultPrefService; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.InputActionBindings; import bdv.export.ProgressWriter; +import bdv.ui.keymap.Keymap; +import bdv.ui.keymap.Keymap.UpdateListener; import bdv.util.DelayedPackDialog; import bdv.viewer.OverlayRenderer; import bdv.viewer.ViewerPanel; @@ -107,7 +108,7 @@ public static class Descriptions extends CommandDescriptionProvider public Descriptions() { - super( KeyConfigContexts.BIGDATAVIEWER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER ); } @Override diff --git a/src/main/java/org/mastodon/views/bdv/export/RecordMovieDialog.java b/src/main/java/org/mastodon/views/bdv/export/RecordMovieDialog.java index 8b638191a..cd2f8873c 100644 --- a/src/main/java/org/mastodon/views/bdv/export/RecordMovieDialog.java +++ b/src/main/java/org/mastodon/views/bdv/export/RecordMovieDialog.java @@ -64,11 +64,8 @@ import org.mastodon.app.MastodonIcons; import org.mastodon.ui.coloring.ColorBarOverlay; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; -import org.mastodon.ui.keymap.Keymap; -import org.mastodon.ui.keymap.Keymap.UpdateListener; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.ui.util.FileChooser; import org.mastodon.ui.util.FileChooser.DialogType; import org.mastodon.ui.util.FileChooser.SelectionMode; @@ -76,11 +73,15 @@ import org.mastodon.views.bdv.overlay.OverlayGraphRenderer; import org.scijava.plugin.Plugin; import org.scijava.prefs.DefaultPrefService; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.InputActionBindings; import bdv.export.ProgressWriter; import bdv.tools.ToggleDialogAction; +import bdv.ui.keymap.Keymap; +import bdv.ui.keymap.Keymap.UpdateListener; import bdv.util.DelayedPackDialog; import bdv.viewer.OverlayRenderer; import bdv.viewer.ViewerPanel; @@ -107,7 +108,7 @@ public static class Descriptions extends CommandDescriptionProvider public Descriptions() { - super( KeyConfigContexts.BIGDATAVIEWER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER ); } @Override diff --git a/src/main/java/org/mastodon/views/bdv/overlay/BdvSelectionBehaviours.java b/src/main/java/org/mastodon/views/bdv/overlay/BdvSelectionBehaviours.java index 2aa8a7946..6b86c8735 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/BdvSelectionBehaviours.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/BdvSelectionBehaviours.java @@ -30,14 +30,15 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.NavigationHandler; import org.mastodon.model.SelectionModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.ClickBehaviour; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedBehaviour; import org.scijava.ui.behaviour.util.Behaviours; @@ -68,7 +69,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.BIGDATAVIEWER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER ); } @Override diff --git a/src/main/java/org/mastodon/views/bdv/overlay/EditBehaviours.java b/src/main/java/org/mastodon/views/bdv/overlay/EditBehaviours.java index 4bc32af9c..c34e548e7 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/EditBehaviours.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/EditBehaviours.java @@ -31,16 +31,17 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import org.mastodon.collection.RefSet; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.SelectionModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.undo.UndoPointMarker; import org.mastodon.views.bdv.overlay.util.JamaEigenvalueDecomposition; import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.ClickBehaviour; import org.scijava.ui.behaviour.DragBehaviour; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedBehaviour; import org.scijava.ui.behaviour.util.Behaviours; @@ -109,7 +110,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.BIGDATAVIEWER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER ); } @Override diff --git a/src/main/java/org/mastodon/views/bdv/overlay/EditSpecialBehaviours.java b/src/main/java/org/mastodon/views/bdv/overlay/EditSpecialBehaviours.java index 9c2f3b723..7b7f57378 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/EditSpecialBehaviours.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/EditSpecialBehaviours.java @@ -39,15 +39,16 @@ import java.awt.geom.AffineTransform; import java.util.concurrent.locks.ReentrantReadWriteLock; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.SelectionModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.undo.UndoPointMarker; import org.mastodon.views.bdv.overlay.ScreenVertexMath.Ellipse; import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.DragBehaviour; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedBehaviour; import org.scijava.ui.behaviour.util.Behaviours; @@ -83,7 +84,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.BIGDATAVIEWER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER ); } @Override diff --git a/src/main/java/org/mastodon/views/bdv/overlay/OverlayActions.java b/src/main/java/org/mastodon/views/bdv/overlay/OverlayActions.java index 6e52cf02e..6062f1780 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/OverlayActions.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/OverlayActions.java @@ -28,11 +28,12 @@ */ package org.mastodon.views.bdv.overlay; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.bdv.overlay.Visibilities.VisibilityMode; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; import bdv.viewer.ViewerPanel; @@ -51,7 +52,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.BIGDATAVIEWER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.BIGDATAVIEWER ); } @Override diff --git a/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationActions.java b/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationActions.java index 9fb2561ab..b9e154ace 100644 --- a/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationActions.java +++ b/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationActions.java @@ -32,16 +32,17 @@ import org.mastodon.collection.ref.RefArrayList; import org.mastodon.graph.algorithm.traversal.UndirectedDepthFirstIterator; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.SelectionModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.grapher.datagraph.DataEdge; import org.mastodon.views.grapher.datagraph.DataGraph; import org.mastodon.views.grapher.datagraph.DataVertex; import org.mastodon.views.trackscheme.display.TrackSchemeNavigationActions.NavigatorEtiquette; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; /** @@ -99,7 +100,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.GRAPHER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.GRAPHER ); } @Override diff --git a/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationBehaviours.java b/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationBehaviours.java index fd08e0948..d09fb37ea 100644 --- a/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationBehaviours.java +++ b/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationBehaviours.java @@ -34,11 +34,10 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import org.mastodon.collection.RefSet; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.NavigationHandler; import org.mastodon.model.SelectionModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.grapher.datagraph.DataEdge; import org.mastodon.views.grapher.datagraph.DataGraph; @@ -49,6 +48,8 @@ import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.ClickBehaviour; import org.scijava.ui.behaviour.DragBehaviour; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedBehaviour; import org.scijava.ui.behaviour.util.Behaviours; @@ -97,7 +98,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.GRAPHER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.GRAPHER ); } @Override diff --git a/src/main/java/org/mastodon/views/grapher/display/DataDisplayZoom.java b/src/main/java/org/mastodon/views/grapher/display/DataDisplayZoom.java index 8fd2a1a67..e31bda23f 100644 --- a/src/main/java/org/mastodon/views/grapher/display/DataDisplayZoom.java +++ b/src/main/java/org/mastodon/views/grapher/display/DataDisplayZoom.java @@ -35,16 +35,17 @@ import org.mastodon.graph.Edge; import org.mastodon.graph.Vertex; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.HasLabel; import org.mastodon.spatial.HasTimepoint; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.grapher.datagraph.ScreenTransform; import org.mastodon.views.grapher.display.OffsetAxes.OffsetAxesListener; import org.mastodon.views.trackscheme.display.TrackSchemeZoom; import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.DragBehaviour; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedBehaviour; import org.scijava.ui.behaviour.util.Behaviours; @@ -76,7 +77,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.GRAPHER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.GRAPHER ); } @Override diff --git a/src/main/java/org/mastodon/views/grapher/display/InertialScreenTransformEventHandler.java b/src/main/java/org/mastodon/views/grapher/display/InertialScreenTransformEventHandler.java index e0d3b0b9a..298426fdc 100644 --- a/src/main/java/org/mastodon/views/grapher/display/InertialScreenTransformEventHandler.java +++ b/src/main/java/org/mastodon/views/grapher/display/InertialScreenTransformEventHandler.java @@ -31,8 +31,7 @@ import java.util.Timer; import java.util.TimerTask; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.grapher.datagraph.DataGraphLayout; import org.mastodon.views.grapher.datagraph.DataGraphLayout.LayoutListener; @@ -44,6 +43,8 @@ import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.DragBehaviour; import org.scijava.ui.behaviour.ScrollBehaviour; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedBehaviour; import org.scijava.ui.behaviour.util.Behaviours; @@ -83,7 +84,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.GRAPHER ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.GRAPHER ); } @Override diff --git a/src/main/java/org/mastodon/views/table/TableViewActions.java b/src/main/java/org/mastodon/views/table/TableViewActions.java index 6e524797c..af8b7cffb 100644 --- a/src/main/java/org/mastodon/views/table/TableViewActions.java +++ b/src/main/java/org/mastodon/views/table/TableViewActions.java @@ -35,13 +35,14 @@ import javax.swing.JOptionPane; import javax.swing.table.TableModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.ui.util.ExtensionFileFilter; import org.mastodon.ui.util.FileChooser; import org.mastodon.views.table.TableViewFrameBuilder.MyTableViewFrame; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.RunnableAction; @@ -216,7 +217,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.TABLE ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.TABLE ); } @Override diff --git a/src/main/java/org/mastodon/views/trackscheme/display/EditFocusVertexLabelAction.java b/src/main/java/org/mastodon/views/trackscheme/display/EditFocusVertexLabelAction.java index c25dbcd09..465daf019 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/EditFocusVertexLabelAction.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/EditFocusVertexLabelAction.java @@ -43,9 +43,8 @@ import javax.swing.SwingUtilities; import org.mastodon.model.FocusModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.undo.UndoPointMarker; import org.mastodon.util.KeyConfigUtils; import org.mastodon.views.trackscheme.ScreenTransform; @@ -53,6 +52,8 @@ import org.mastodon.views.trackscheme.TrackSchemeVertex; import org.mastodon.views.trackscheme.display.OffsetHeaders.OffsetHeadersListener; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedAction; import org.scijava.ui.behaviour.util.Actions; @@ -80,7 +81,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.TRACKSCHEME ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.TRACKSCHEME ); } @Override diff --git a/src/main/java/org/mastodon/views/trackscheme/display/InertialScreenTransformEventHandler.java b/src/main/java/org/mastodon/views/trackscheme/display/InertialScreenTransformEventHandler.java index d4188655c..2d9605c6d 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/InertialScreenTransformEventHandler.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/InertialScreenTransformEventHandler.java @@ -31,8 +31,7 @@ import java.util.Timer; import java.util.TimerTask; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.trackscheme.LineageTreeLayout; import org.mastodon.views.trackscheme.LineageTreeLayout.LayoutListener; @@ -44,6 +43,8 @@ import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.DragBehaviour; import org.scijava.ui.behaviour.ScrollBehaviour; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedBehaviour; import org.scijava.ui.behaviour.util.Behaviours; @@ -83,7 +84,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.TRACKSCHEME ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.TRACKSCHEME ); } @Override diff --git a/src/main/java/org/mastodon/views/trackscheme/display/ShowSelectedTracksActions.java b/src/main/java/org/mastodon/views/trackscheme/display/ShowSelectedTracksActions.java index 50835dd8a..a22e40518 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/ShowSelectedTracksActions.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/ShowSelectedTracksActions.java @@ -36,10 +36,9 @@ import org.mastodon.collection.ref.RefSetImp; import org.mastodon.graph.Edge; import org.mastodon.graph.Vertex; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.RootsModel; import org.mastodon.model.SelectionModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.util.TreeUtils; import org.mastodon.views.trackscheme.LexicographicalVertexOrder; @@ -47,6 +46,8 @@ import org.mastodon.views.trackscheme.TrackSchemeGraph; import org.mastodon.views.trackscheme.TrackSchemeVertex; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.RunnableAction; @@ -77,7 +78,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.MASTODON ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.MASTODON ); } @Override @@ -172,7 +173,7 @@ private RefList< TrackSchemeVertex > getSelectedSubtreeRoots() final RefSet< TrackSchemeVertex > selectedNodes = new RefSetImp<>( viewGraph.getVertexPool() ); selectedNodes.addAll( selectionModel.getSelectedVertices() ); addEdgeTargets( selectedNodes, selectionModel.getSelectedEdges() ); - RefList< TrackSchemeVertex > sortedRoots = LexicographicalVertexOrder.sort( viewGraph, viewGraph.getRoots() ); + final RefList< TrackSchemeVertex > sortedRoots = LexicographicalVertexOrder.sort( viewGraph, viewGraph.getRoots() ); return TreeUtils.findSelectedSubtreeRoots( viewGraph, sortedRoots, selectedNodes ); } @@ -195,7 +196,7 @@ private void addEdgeTargets( final RefSet< TrackSchemeVertex > selected, private RefList< TrackSchemeVertex > getRealRoots( final RefSet< TrackSchemeVertex > selectedNodes ) { - RefSet< TrackSchemeVertex > roots = TreeUtils.findRootsOfTheGivenNodes( viewGraph, selectedNodes ); + final RefSet< TrackSchemeVertex > roots = TreeUtils.findRootsOfTheGivenNodes( viewGraph, selectedNodes ); return LexicographicalVertexOrder.sort( viewGraph, roots ); } } diff --git a/src/main/java/org/mastodon/views/trackscheme/display/ToggleLinkBehaviour.java b/src/main/java/org/mastodon/views/trackscheme/display/ToggleLinkBehaviour.java index dfeb3136e..e9245d095 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/ToggleLinkBehaviour.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/ToggleLinkBehaviour.java @@ -31,8 +31,6 @@ */ package org.mastodon.views.trackscheme.display; -import bdv.viewer.OverlayRenderer; -import bdv.viewer.TransformListener; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; @@ -42,9 +40,8 @@ import org.mastodon.graph.Edge; import org.mastodon.graph.GraphChangeNotifier; import org.mastodon.graph.Vertex; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.spatial.HasTimepoint; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.undo.UndoPointMarker; import org.mastodon.views.trackscheme.ScreenTransform; @@ -53,9 +50,14 @@ import org.mastodon.views.trackscheme.TrackSchemeVertex; import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.DragBehaviour; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedBehaviour; import org.scijava.ui.behaviour.util.Behaviours; +import bdv.viewer.OverlayRenderer; +import bdv.viewer.TransformListener; + /** * Bahviour for creating / deleting links in TrackScheme views. * @@ -83,7 +85,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.TRACKSCHEME ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.TRACKSCHEME ); } @Override diff --git a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationActions.java b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationActions.java index df3ad8240..df8180344 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationActions.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationActions.java @@ -30,16 +30,17 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.SelectionModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.trackscheme.LineageTreeLayout; import org.mastodon.views.trackscheme.TrackSchemeEdge; import org.mastodon.views.trackscheme.TrackSchemeGraph; import org.mastodon.views.trackscheme.TrackSchemeVertex; import org.scijava.plugin.Plugin; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.Actions; /** @@ -96,7 +97,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.TRACKSCHEME ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.TRACKSCHEME ); } @Override diff --git a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationBehaviours.java b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationBehaviours.java index 79698bb7a..fa42212eb 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationBehaviours.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationBehaviours.java @@ -28,19 +28,15 @@ */ package org.mastodon.views.trackscheme.display; -import bdv.viewer.InteractiveDisplayCanvas; -import bdv.viewer.OverlayRenderer; -import bdv.viewer.TransformListener; import java.awt.Color; import java.awt.Graphics; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.mastodon.collection.RefSet; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.NavigationHandler; import org.mastodon.model.SelectionModel; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.trackscheme.LineageTreeLayout; import org.mastodon.views.trackscheme.ScreenTransform; @@ -51,9 +47,15 @@ import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.ClickBehaviour; import org.scijava.ui.behaviour.DragBehaviour; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedBehaviour; import org.scijava.ui.behaviour.util.Behaviours; +import bdv.viewer.InteractiveDisplayCanvas; +import bdv.viewer.OverlayRenderer; +import bdv.viewer.TransformListener; + /** * Focus and selection behaviours in TrackScheme. * @@ -95,7 +97,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.TRACKSCHEME ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.TRACKSCHEME ); } @Override diff --git a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeZoom.java b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeZoom.java index b854a40ca..f7229c59f 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeZoom.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeZoom.java @@ -28,8 +28,6 @@ */ package org.mastodon.views.trackscheme.display; -import bdv.viewer.OverlayRenderer; -import bdv.viewer.TransformListener; import java.awt.Color; import java.awt.Graphics; @@ -37,17 +35,21 @@ import org.mastodon.graph.Edge; import org.mastodon.graph.Vertex; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.spatial.HasTimepoint; -import org.mastodon.ui.keymap.CommandDescriptionProvider; -import org.mastodon.ui.keymap.CommandDescriptions; import org.mastodon.ui.keymap.KeyConfigContexts; import org.mastodon.views.trackscheme.ScreenTransform; import org.mastodon.views.trackscheme.display.OffsetHeaders.OffsetHeadersListener; import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.DragBehaviour; +import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; +import org.scijava.ui.behaviour.io.gui.CommandDescriptions; import org.scijava.ui.behaviour.util.AbstractNamedBehaviour; import org.scijava.ui.behaviour.util.Behaviours; +import bdv.viewer.OverlayRenderer; +import bdv.viewer.TransformListener; + /** * Drag behaviour that implements a zoom rectangle in TrackScheme. * @@ -73,7 +75,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigContexts.TRACKSCHEME ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.TRACKSCHEME ); } @Override diff --git a/src/test/java/org/mastodon/mamut/feature/ui/FeatureColorModeConfigPageDemo.java b/src/test/java/org/mastodon/mamut/feature/ui/FeatureColorModeConfigPageDemo.java index ce04015f5..c43c7875e 100644 --- a/src/test/java/org/mastodon/mamut/feature/ui/FeatureColorModeConfigPageDemo.java +++ b/src/test/java/org/mastodon/mamut/feature/ui/FeatureColorModeConfigPageDemo.java @@ -41,9 +41,10 @@ import org.mastodon.mamut.model.Model; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; import org.mastodon.ui.keymap.KeyConfigContexts; -import org.mastodon.ui.keymap.Keymap; import org.scijava.Context; +import bdv.ui.keymap.Keymap; + public class FeatureColorModeConfigPageDemo { private static final String FEATURECOLORMODE_SETTINGSPAGE_TREEPATH = "Feature Color Modes"; From 071c490a17a31492dc99b95cdf5eb77cf5bc68ff Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Mon, 21 Aug 2023 16:36:34 +0200 Subject: [PATCH 047/220] Add some javadoc. --- .../org/mastodon/mamut/model/ModelUtils.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/org/mastodon/mamut/model/ModelUtils.java b/src/main/java/org/mastodon/mamut/model/ModelUtils.java index 5a3c0f8ad..589e763e8 100644 --- a/src/main/java/org/mastodon/mamut/model/ModelUtils.java +++ b/src/main/java/org/mastodon/mamut/model/ModelUtils.java @@ -48,11 +48,31 @@ public class ModelUtils { + /** + * Returns a string representation of the specified model content as two + * text table. + *

    + * The full model is printed. + * + * @param model + * the model. + * @return a String representation of the model. + */ public static final String dump( final Model model ) { return dump( model, Long.MAX_VALUE ); } + /** + * Returns a string representation of the specified model content as two + * text table. + *

    + * The printed content is limited to the specified number of lines. + * + * @param model + * the model. + * @return a String representation of the model. + */ public static final String dump( final Model model, final long maxLines ) { final String spaceUnits = Optional.ofNullable( model.getSpaceUnits() ).orElse( "" ); From b80159bba25b41c20eeec4d9ab99a287435968f7 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Tue, 22 Aug 2023 16:38:50 +0200 Subject: [PATCH 048/220] Recompute min & max timepoint everytime they are queried. During a discussion with @stefanhahmann We don't need to store the values determined at startup, because we can get them from the current shared BDV data. In theory this makes it possible to have Mastodon views reflects changes in the image data (even if we have no cases for it yet). Plus, it's shorter and more elegant. However, we will need to double-chek that everything is ok with BDV files, ImagePlus and DUMMY image file format. --- .../java/org/mastodon/mamut/ProjectModel.java | 20 +++++++++++-------- .../views/bdv/SharedBigDataViewerData.java | 17 +++++----------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/ProjectModel.java b/src/main/java/org/mastodon/mamut/ProjectModel.java index 004b9c249..9d06d157f 100644 --- a/src/main/java/org/mastodon/mamut/ProjectModel.java +++ b/src/main/java/org/mastodon/mamut/ProjectModel.java @@ -69,10 +69,6 @@ public class ProjectModel extends MastodonAppModel< Model, Spot, Link > implemen private final SharedBigDataViewerData sharedBdvData; - private final int minTimepoint; - - private final int maxTimepoint; - private final BranchGraphSynchronizer branchGraphSync; private final Listeners.List< CloseListener > closeListeners = new Listeners.List<>(); @@ -104,8 +100,6 @@ private ProjectModel( this.project = project; this.radiusStats = new BoundingSphereRadiusStatistics( model ); this.sharedBdvData = sharedBdvData; - this.minTimepoint = 0; - this.maxTimepoint = sharedBdvData.getNumTimepoints() - 1; final Keymap keymap = keymapManager.getForwardSelectedKeymap(); keymap.updateListeners().add( () -> { @@ -162,14 +156,24 @@ public SharedBigDataViewerData getSharedBdvData() return sharedBdvData; } + /** + * Returns the starting time-point in the image data. + * + * @return the starting time-point. + */ public int getMinTimepoint() { - return minTimepoint; + return 0; } + /** + * Returns the last time-point in the image data. + * + * @return the last time-point. + */ public int getMaxTimepoint() { - return maxTimepoint; + return sharedBdvData.getNumTimepoints() - 1; } public BranchGraphSynchronizer getBranchGraphSync() diff --git a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java index 4adcb5dcc..071884f32 100644 --- a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java +++ b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java @@ -107,8 +107,6 @@ public class SharedBigDataViewerData private final AbstractSpimData< ? > spimData; - private final int numTimepoints; - private final CacheControl cache; private final boolean is2D; @@ -119,14 +117,12 @@ private SharedBigDataViewerData( final AbstractSpimData< ? > spimData, final ArrayList< SourceAndConverter< ? > > sources, final ConverterSetups setups, - final CacheControl cache, - final int numTimepoints ) + final CacheControl cache ) { this.spimData = spimData; this.sources = sources; this.setups = setups; this.cache = cache; - this.numTimepoints = numTimepoints; final ViewerOptions lvo = new ViewerOptions(); this.inputTriggerConfig = ( lvo.values.getInputTriggerConfig() != null ) @@ -344,7 +340,7 @@ public ConverterSetups getConverterSetups() public int getNumTimepoints() { - return numTimepoints; + return spimData.getSequenceDescription().getTimePoints().size(); } public CacheControl getCache() @@ -388,7 +384,7 @@ private boolean computeIs2D() for ( final SourceAndConverter< ? > sac : sources ) { final Source< ? > source = sac.getSpimSource(); - for ( int t = 0; t < numTimepoints; t++ ) + for ( int t = 0; t < getNumTimepoints(); t++ ) { if ( source.isPresent( t ) ) { @@ -433,7 +429,6 @@ private static SharedBigDataViewerData fromSpimData( final AbstractSpimData< ? > spimData ) { final AbstractSequenceDescription< ?, ?, ? > seq = spimData.getSequenceDescription(); - final int numTimepoints = seq.getTimePoints().size(); final CacheControl cache = ( ( ViewerImgLoader ) seq.getImgLoader() ).getCacheControl(); final ArrayList< ConverterSetup > converterSetups = new ArrayList<>(); @@ -450,8 +445,7 @@ private static SharedBigDataViewerData fromSpimData( spimData, sources, setups, - cache, - numTimepoints ); + cache ); if ( !sbdv.tryLoadSettings( spimDataXmlFilename ) ) { @@ -593,8 +587,7 @@ public static SharedBigDataViewerData fromImagePlus( final ImagePlus imp ) spimData, sources, css, - cache, - numTimepoints ); + cache ); // File info final FileInfo fileInfo = imp.getOriginalFileInfo(); From c1091268918b4961e0460ace9b03f495916c2f90 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Tue, 22 Aug 2023 16:39:32 +0200 Subject: [PATCH 049/220] Code style changes. --- .../java/org/mastodon/util/DummySpimData.java | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/mastodon/util/DummySpimData.java b/src/main/java/org/mastodon/util/DummySpimData.java index 674405602..63438e952 100644 --- a/src/main/java/org/mastodon/util/DummySpimData.java +++ b/src/main/java/org/mastodon/util/DummySpimData.java @@ -39,6 +39,13 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; +import org.apache.commons.io.FilenameUtils; +import org.jdom2.Document; +import org.jdom2.JDOMException; +import org.jdom2.input.SAXBuilder; +import org.jdom2.output.Format; +import org.jdom2.output.XMLOutputter; + import bdv.spimdata.SequenceDescriptionMinimal; import bdv.spimdata.SpimDataMinimal; import bdv.spimdata.XmlIoSpimDataMinimal; @@ -56,12 +63,6 @@ import net.imglib2.realtransform.AffineTransform3D; import net.imglib2.type.numeric.integer.UnsignedShortType; import net.imglib2.util.Cast; -import org.apache.commons.io.FilenameUtils; -import org.jdom2.Document; -import org.jdom2.JDOMException; -import org.jdom2.input.SAXBuilder; -import org.jdom2.output.Format; -import org.jdom2.output.XMLOutputter; /** * Create dummy {@link SpimDataMinimal} with a {@code BasicImgLoader} that @@ -77,7 +78,7 @@ public class DummySpimData { static public final String DUMMY = ".dummy"; - public static boolean isDummyString( String name ) + public static boolean isDummyString( final String name ) { return name.endsWith( DUMMY ); } @@ -141,7 +142,6 @@ public static SpimDataMinimal tryCreate( final int x, final int y, final int z, IntStream.range( 0, t ).mapToObj( tp -> new ViewRegistration( tp, 0, calib ) ) .collect( Collectors.toList() ) ); return new SpimDataMinimal( basePath, sequenceDescription, viewRegistrations ); - } private static double get( final String[] parts, final String key, final double defaultValue ) @@ -159,40 +159,40 @@ private static double get( final String[] parts, final String key, final double } /** - * @return a {@link AbstractSpimData} object. Pixel sizes, - * image sizes, and image transformations are read from the given - * BigDataViewer XML. The actual image data is not loaded, all pixels - * are black. {@link DummyImgLoader} is used to provide the dummy image data. + * @return a {@link AbstractSpimData} object. Pixel sizes, image sizes, and + * image transformations are read from the given BigDataViewer XML. + * The actual image data is not loaded, all pixels are black. + * {@link DummyImgLoader} is used to provide the dummy image data. */ - public static AbstractSpimData< ? > fromSpimDataXml( String spimDataXmlFilename ) + public static AbstractSpimData< ? > fromSpimDataXml( final String spimDataXmlFilename ) throws SpimDataException { - File modifiedXml = getBdvXmlWithoutImageLoader( new File( spimDataXmlFilename ) ); - AbstractSpimData< ? > spimData = new XmlIoSpimDataMinimal().load( modifiedXml.getAbsolutePath() ); + final File modifiedXml = getBdvXmlWithoutImageLoader( new File( spimDataXmlFilename ) ); + final AbstractSpimData< ? > spimData = new XmlIoSpimDataMinimal().load( modifiedXml.getAbsolutePath() ); setDummyImageLoader( spimData ); return spimData; } - private static File getBdvXmlWithoutImageLoader( File xmlFile ) + private static File getBdvXmlWithoutImageLoader( final File xmlFile ) { - Document document = readXml( xmlFile ); + final Document document = readXml( xmlFile ); document.getRootElement() .getChild( "SequenceDescription" ) .removeChildren( "ImageLoader" ); return writeXmlToTmpFile( document ); } - private static void setDummyImageLoader( AbstractSpimData< ? > spimData ) + private static void setDummyImageLoader( final AbstractSpimData< ? > spimData ) { final AbstractSequenceDescription< ?, ?, BasicImgLoader > seq = Cast.unchecked( spimData.getSequenceDescription() ); - List< Dimensions > dimensionsList = new ArrayList<>(); - for ( BasicViewSetup basicViewSetup : seq.getViewSetupsOrdered() ) + final List< Dimensions > dimensionsList = new ArrayList<>(); + for ( final BasicViewSetup basicViewSetup : seq.getViewSetupsOrdered() ) dimensionsList.add( basicViewSetup.getSize() ); seq.setImgLoader( new DummyImgLoader( new UnsignedShortType(), dimensionsList ) ); } - private static Document readXml( File xmlFile ) + private static Document readXml( final File xmlFile ) { try { @@ -204,11 +204,11 @@ private static Document readXml( File xmlFile ) } } - private static File writeXmlToTmpFile( Document document ) + private static File writeXmlToTmpFile( final Document document ) { try { - File file = File.createTempFile( "dataset-dummy-img-loader", ".xml" ); + final File file = File.createTempFile( "dataset-dummy-img-loader", ".xml" ); file.deleteOnExit(); try (OutputStream outputStream = new FileOutputStream( file )) { @@ -216,7 +216,7 @@ private static File writeXmlToTmpFile( Document document ) } return file; } - catch ( IOException e ) + catch ( final IOException e ) { throw new RuntimeException( e ); } From 53642711efb9ebb67b8722c8cd14048e20516e73 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Wed, 23 Aug 2023 13:28:24 +0200 Subject: [PATCH 050/220] An intermediate abstract class for style managers with YAML. Offers common facilities to load / save user styles from / to a YAML file. Since it is the only case in Mastodon we hope to remove quite some duplicated code. --- .../app/ui/AbstractStyleManagerYaml.java | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/main/java/org/mastodon/app/ui/AbstractStyleManagerYaml.java diff --git a/src/main/java/org/mastodon/app/ui/AbstractStyleManagerYaml.java b/src/main/java/org/mastodon/app/ui/AbstractStyleManagerYaml.java new file mode 100644 index 000000000..53ed4d4bc --- /dev/null +++ b/src/main/java/org/mastodon/app/ui/AbstractStyleManagerYaml.java @@ -0,0 +1,94 @@ +package org.mastodon.app.ui; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Set; +import java.util.stream.Collectors; + +import org.mastodon.io.IOUtils; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.error.YAMLException; + +import bdv.ui.settings.style.AbstractStyleManager; +import bdv.ui.settings.style.Style; + +/** + * Intermediate abstract class for {@link AbstractStyleManager}s that offers + * common facilities to load / save user styles from / to a YAML file. + */ +public abstract class AbstractStyleManagerYaml< M extends AbstractStyleManager< M, S >, S extends Style< S > > extends AbstractStyleManager< M, S > +{ + + protected abstract Yaml createYaml(); + + public void loadStyles( final String filename ) + { + userStyles.clear(); + final Set< String > names = builtinStyles.stream().map( S::getName ).collect( Collectors.toSet() ); + try + { + final FileReader input = new FileReader( filename ); + final Iterable< Object > objs = createYaml().loadAll( input ); + String defaultStyleName = null; + @SuppressWarnings( "unchecked" ) + final Class< S > klass = ( Class< S > ) selectedStyle.getClass(); + try + { + for ( final Object obj : objs ) + { + if ( obj instanceof String ) + { + defaultStyleName = ( String ) obj; + } + else if ( klass.isInstance( obj ) ) + { + @SuppressWarnings( "unchecked" ) + final S style = ( S ) obj; + if ( null != style ) + { + // sanity check: settings names must be unique + if ( names.add( style.getName() ) ) + userStyles.add( style ); + else + System.out.println( "Discarded settings with duplicate name \"" + style.getName() + "\"." ); + } + } + } + } + catch ( final YAMLException pe ) + { + System.out.println( "Problem parsing the settings file " + filename + ":\n" + pe.getMessage() + "\nUsing builtin settings." ); + setSelectedStyle( builtinStyles.get( 0 ) ); + return; + } + setSelectedStyle( styleForName( defaultStyleName ).orElseGet( () -> builtinStyles.get( 0 ) ) ); + } + catch ( final FileNotFoundException e ) + { + System.out.println( "Settings file " + filename + " not found. Using builtin settings." ); + } + } + + public void saveStyles( final String filename ) + { + try + { + IOUtils.mkdirs( filename ); + new File( filename ).getParentFile().mkdirs(); + final FileWriter output = new FileWriter( filename ); + final ArrayList< Object > objects = new ArrayList<>(); + objects.add( selectedStyle.getName() ); + objects.addAll( userStyles ); + createYaml().dumpAll( objects.iterator(), output ); + output.close(); + } + catch ( final IOException e ) + { + System.out.println( "Problem writing to the settings file " + filename + "\n" + e.getMessage() ); + } + } +} From 6db9f933c6b45d1eab6ab294fe7c4d2e7c021b8e Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Wed, 23 Aug 2023 13:29:13 +0200 Subject: [PATCH 051/220] Use the YAML style manager as mother class for Mastodon style managers. Remove plenty of duplicated code. --- .../feature/FeatureColorModeManager.java | 77 ++--------------- .../bdv/overlay/ui/RenderSettingsManager.java | 72 ++-------------- .../style/DataDisplayStyleManager.java | 65 ++------------- .../style/TrackSchemeStyleManager.java | 83 ++----------------- 4 files changed, 23 insertions(+), 274 deletions(-) diff --git a/src/main/java/org/mastodon/ui/coloring/feature/FeatureColorModeManager.java b/src/main/java/org/mastodon/ui/coloring/feature/FeatureColorModeManager.java index d164cbfb6..19e60114f 100644 --- a/src/main/java/org/mastodon/ui/coloring/feature/FeatureColorModeManager.java +++ b/src/main/java/org/mastodon/ui/coloring/feature/FeatureColorModeManager.java @@ -28,23 +28,15 @@ */ package org.mastodon.ui.coloring.feature; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; +import org.mastodon.app.ui.AbstractStyleManagerYaml; import org.scijava.listeners.Listeners; import org.yaml.snakeyaml.Yaml; -import bdv.ui.settings.style.AbstractStyleManager; - -public class FeatureColorModeManager extends AbstractStyleManager< FeatureColorModeManager, FeatureColorMode > +public class FeatureColorModeManager extends AbstractStyleManagerYaml< FeatureColorModeManager, FeatureColorMode > { private static final String COLOR_MODE_FILE = System.getProperty( "user.home" ) + "/.mastodon/colormodes.yaml"; @@ -85,70 +77,11 @@ public void saveStyles() saveStyles( COLOR_MODE_FILE ); } - public void saveStyles( final String filename ) - { - try (final FileWriter output = new FileWriter( filename )) - { - new File( filename ).mkdirs(); // TODO pointless. FileWriter already opened or failed. - final Yaml yaml = FeatureColorModeIO.createYaml(); - final ArrayList< Object > objects = new ArrayList<>(); - objects.add( selectedStyle.getName() ); - objects.addAll( userStyles ); - yaml.dumpAll( objects.iterator(), output ); - } - catch ( final IOException e ) - { - e.printStackTrace(); - } - } - public void loadModes() { loadStyles( COLOR_MODE_FILE ); } - public void loadStyles( final String filename ) - { - userStyles.clear(); - final Set< String > names = - builtinStyles.stream().map( FeatureColorMode::getName ).collect( Collectors.toSet() ); - try (final FileReader input = new FileReader( filename )) - { - final Yaml yaml = FeatureColorModeIO.createYaml(); - final Iterable< Object > objs = yaml.loadAll( input ); - String defaultStyleName = null; - for ( final Object obj : objs ) - { - if ( obj instanceof String ) - { - defaultStyleName = ( String ) obj; - } - else if ( obj instanceof FeatureColorMode ) - { - final FeatureColorMode ts = ( FeatureColorMode ) obj; - if ( null != ts ) - { - // sanity check: style names must be unique - if ( names.add( ts.getName() ) ) - userStyles.add( ts ); - else - System.out.println( "Discarded color mode with duplicate name \"" + ts.getName() + "\"." ); - } - } - } - setSelectedStyle( styleForName( defaultStyleName ).orElseGet( () -> builtinStyles.get( 0 ) ) ); - } - catch ( final FileNotFoundException e ) - { - System.out.println( "Feature color mode file " + filename + " not found. Using builtin styles." ); - } - catch ( final IOException e1 ) - { - System.out.println( "Troube reading feature color mode file " + filename + ". Using builtin styles." ); - e1.printStackTrace(); - } - } - @Override protected List< FeatureColorMode > loadBuiltinStyles() { @@ -159,4 +92,10 @@ private void notifyListeners() { featureColorModesListeners.list.forEach( FeatureColorModesListener::featureColorModesChanged ); } + + @Override + protected Yaml createYaml() + { + return FeatureColorModeIO.createYaml(); + } } diff --git a/src/main/java/org/mastodon/views/bdv/overlay/ui/RenderSettingsManager.java b/src/main/java/org/mastodon/views/bdv/overlay/ui/RenderSettingsManager.java index 8fb4715fe..8f11389f1 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/ui/RenderSettingsManager.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/ui/RenderSettingsManager.java @@ -28,22 +28,14 @@ */ package org.mastodon.views.bdv.overlay.ui; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import org.mastodon.io.IOUtils; +import org.mastodon.app.ui.AbstractStyleManagerYaml; import org.mastodon.views.bdv.overlay.RenderSettings; import org.yaml.snakeyaml.Yaml; -import bdv.ui.settings.style.AbstractStyleManager; - /** * Manages a list of {@link RenderSettings} for multiple BDV windows. Provides * models based on a common list of settings than can be used in swing items. @@ -51,7 +43,7 @@ * @author Jean-Yves Tinevez * @author Tobias Pietzsch */ -public class RenderSettingsManager extends AbstractStyleManager< RenderSettingsManager, RenderSettings > +public class RenderSettingsManager extends AbstractStyleManagerYaml< RenderSettingsManager, RenderSettings > { private static final String STYLE_FILE = System.getProperty( "user.home" ) + "/.mastodon/rendersettings.yaml"; @@ -110,69 +102,15 @@ public void loadStyles() loadStyles( STYLE_FILE ); } - public void loadStyles( final String filename ) - { - userStyles.clear(); - final Set< String > names = builtinStyles.stream().map( RenderSettings::getName ).collect( Collectors.toSet() ); - try - { - final FileReader input = new FileReader( filename ); - final Yaml yaml = RenderSettingsIO.createYaml(); - final Iterable< Object > objs = yaml.loadAll( input ); - String defaultStyleName = null; - for ( final Object obj : objs ) - { - if ( obj instanceof String ) - { - defaultStyleName = ( String ) obj; - // System.out.println( "RenderSettingsManager.loadStyles" ); - // System.out.println( defaultStyleName ); - } - else if ( obj instanceof RenderSettings ) - { - final RenderSettings ts = ( RenderSettings ) obj; - if ( null != ts ) - { - // sanity check: style names must be unique - if ( names.add( ts.getName() ) ) - userStyles.add( ts ); - else - { - // System.out.println( "Discarded style with duplicate name \"" + ts.getName() + "\"." ); - } - } - } - } - setSelectedStyle( styleForName( defaultStyleName ).orElseGet( () -> builtinStyles.get( 0 ) ) ); - } - catch ( final FileNotFoundException e ) - { - // System.out.println( "Bdv style file " + filename + " not found. Using builtin styles." ); - } - } - @Override public void saveStyles() { saveStyles( STYLE_FILE ); } - public void saveStyles( final String filename ) + @Override + protected Yaml createYaml() { - try - { - IOUtils.mkdirs( filename ); - final FileWriter output = new FileWriter( filename ); - final Yaml yaml = RenderSettingsIO.createYaml(); - final ArrayList< Object > objects = new ArrayList<>(); - objects.add( selectedStyle.getName() ); - objects.addAll( userStyles ); - yaml.dumpAll( objects.iterator(), output ); - output.close(); - } - catch ( final IOException e ) - { - e.printStackTrace(); - } + return RenderSettingsIO.createYaml(); } } diff --git a/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleManager.java b/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleManager.java index d9dafe76f..1206a011c 100644 --- a/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleManager.java +++ b/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleManager.java @@ -28,21 +28,13 @@ */ package org.mastodon.views.grapher.display.style; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import org.mastodon.io.IOUtils; +import org.mastodon.app.ui.AbstractStyleManagerYaml; import org.yaml.snakeyaml.Yaml; -import bdv.ui.settings.style.AbstractStyleManager; - /** * Manages a collection of {@link DataDisplayStyle}. *

    @@ -52,7 +44,7 @@ * @author Jean-Yves Tinevez * @author Tobias Pietzsch */ -public class DataDisplayStyleManager extends AbstractStyleManager< DataDisplayStyleManager, DataDisplayStyle > +public class DataDisplayStyleManager extends AbstractStyleManagerYaml< DataDisplayStyleManager, DataDisplayStyle > { private static final String STYLE_FILE = System.getProperty( "user.home" ) + "/.mastodon/datagraphstyles.yaml"; @@ -111,62 +103,15 @@ public void loadStyles() loadStyles( STYLE_FILE ); } - public void loadStyles( final String filename ) - { - userStyles.clear(); - final Set< String > names = - builtinStyles.stream().map( DataDisplayStyle::getName ).collect( Collectors.toSet() ); - try - { - final FileReader input = new FileReader( filename ); - final Yaml yaml = DataDisplayStyleIO.createYaml(); - final Iterable< Object > objs = yaml.loadAll( input ); - String defaultStyleName = null; - for ( final Object obj : objs ) - { - if ( obj instanceof String ) - { - defaultStyleName = ( String ) obj; - } - else if ( obj instanceof DataDisplayStyle ) - { - final DataDisplayStyle ts = ( DataDisplayStyle ) obj; - if ( null != ts ) - { - // sanity check: style names must be unique - if ( names.add( ts.getName() ) ) - userStyles.add( ts ); - } - } - } - setSelectedStyle( styleForName( defaultStyleName ).orElseGet( () -> builtinStyles.get( 0 ) ) ); - } - catch ( final FileNotFoundException e ) - {} - } - @Override public void saveStyles() { saveStyles( STYLE_FILE ); } - public void saveStyles( final String filename ) + @Override + protected Yaml createYaml() { - try - { - IOUtils.mkdirs( filename ); - final FileWriter output = new FileWriter( filename ); - final Yaml yaml = DataDisplayStyleIO.createYaml(); - final ArrayList< Object > objects = new ArrayList<>(); - objects.add( selectedStyle.getName() ); - objects.addAll( userStyles ); - yaml.dumpAll( objects.iterator(), output ); - output.close(); - } - catch ( final IOException e ) - { - e.printStackTrace(); - } + return DataDisplayStyleIO.createYaml(); } } diff --git a/src/main/java/org/mastodon/views/trackscheme/display/style/TrackSchemeStyleManager.java b/src/main/java/org/mastodon/views/trackscheme/display/style/TrackSchemeStyleManager.java index 74258fc55..44e7a0a38 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/style/TrackSchemeStyleManager.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/style/TrackSchemeStyleManager.java @@ -28,21 +28,13 @@ */ package org.mastodon.views.trackscheme.display.style; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; +import org.mastodon.app.ui.AbstractStyleManagerYaml; import org.yaml.snakeyaml.Yaml; -import bdv.ui.settings.style.AbstractStyleManager; - /** * Manages a collection of {@link TrackSchemeStyle}. *

    @@ -52,7 +44,7 @@ * @author Jean-Yves Tinevez * @author Tobias Pietzsch */ -public class TrackSchemeStyleManager extends AbstractStyleManager< TrackSchemeStyleManager, TrackSchemeStyle > +public class TrackSchemeStyleManager extends AbstractStyleManagerYaml< TrackSchemeStyleManager, TrackSchemeStyle > { private static final String STYLE_FILE = System.getProperty( "user.home" ) + "/.mastodon/trackschemestyles.yaml"; @@ -111,80 +103,15 @@ public void loadStyles() loadStyles( STYLE_FILE ); } - public void loadStyles( final String filename ) - { - userStyles.clear(); - final Set< String > names = - builtinStyles.stream().map( TrackSchemeStyle::getName ).collect( Collectors.toSet() ); - try - { - final FileReader input = new FileReader( filename ); - final Yaml yaml = TrackSchemeStyleIO.createYaml(); - final Iterable< Object > objs = yaml.loadAll( input ); - String defaultStyleName = null; - for ( final Object obj : objs ) - { - if ( obj instanceof String ) - { - defaultStyleName = ( String ) obj; - // System.out.println( "TrackSchemeStyleManager.loadStyles" ); - // System.out.println( defaultStyleName ); - } - else if ( obj instanceof TrackSchemeStyle ) - { - final TrackSchemeStyle ts = ( TrackSchemeStyle ) obj; - if ( null != ts ) - { - // sanity check: style names must be unique - if ( names.add( ts.getName() ) ) - userStyles.add( ts ); - else - { - // System.out.println( "Discarded style with duplicate name \"" + ts.getName() + "\"." ); - } - } - } - } - setSelectedStyle( styleForName( defaultStyleName ).orElseGet( () -> builtinStyles.get( 0 ) ) ); - } - catch ( final FileNotFoundException e ) - { - // System.out.println( "TrackScheme style file " + filename + " not found. Using builtin styles." ); - } - } - @Override public void saveStyles() { saveStyles( STYLE_FILE ); } - public void saveStyles( final String filename ) - { - try - { - mkdirs( filename ); - final FileWriter output = new FileWriter( filename ); - final Yaml yaml = TrackSchemeStyleIO.createYaml(); - final ArrayList< Object > objects = new ArrayList<>(); - objects.add( selectedStyle.getName() ); - objects.addAll( userStyles ); - yaml.dumpAll( objects.iterator(), output ); - output.close(); - } - catch ( final IOException e ) - { - e.printStackTrace(); - } - } - - /* - * STATIC UTILITIES - */ - - private static boolean mkdirs( final String fileName ) + @Override + protected Yaml createYaml() { - final File dir = new File( fileName ).getParentFile(); - return dir == null ? false : dir.mkdirs(); + return TrackSchemeStyleIO.createYaml(); } } From d090c58002aa8682a08553bd4b49c5bfd7ccb12e Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Wed, 23 Aug 2023 13:31:28 +0200 Subject: [PATCH 052/220] Offer facilities to deserialize from YAML with catchable errors. Ko made me realize that with slight deviation from what is expected in a YAML file, Mastodon will crash with no recoverable exception. This commmit introduces some methods to deserialize common core values that gracefully trigger an exception, with a useful error message. This exception is caught by the load() method of the style manager, which handles them gracefully. --- .../io/yaml/AbstractWorkaroundConstruct.java | 73 ++++++++++++++++ .../coloring/feature/FeatureColorModeIO.java | 25 +++--- .../bdv/overlay/ui/RenderSettingsIO.java | 63 +++++--------- .../display/style/DataDisplayStyleIO.java | 27 +++--- .../display/style/TrackSchemeStyleIO.java | 85 +++++++------------ 5 files changed, 151 insertions(+), 122 deletions(-) diff --git a/src/main/java/org/mastodon/io/yaml/AbstractWorkaroundConstruct.java b/src/main/java/org/mastodon/io/yaml/AbstractWorkaroundConstruct.java index 6ca24bb32..432d5823e 100644 --- a/src/main/java/org/mastodon/io/yaml/AbstractWorkaroundConstruct.java +++ b/src/main/java/org/mastodon/io/yaml/AbstractWorkaroundConstruct.java @@ -32,6 +32,7 @@ import java.util.Map; import org.yaml.snakeyaml.constructor.AbstractConstruct; +import org.yaml.snakeyaml.error.YAMLException; import org.yaml.snakeyaml.nodes.MappingNode; import org.yaml.snakeyaml.nodes.SequenceNode; import org.yaml.snakeyaml.nodes.Tag; @@ -62,4 +63,76 @@ protected Tag getTag() { return tag; } + + /* + * Static utilities to facilitate 'manually' reconstructing an object from a + * YAML list, and generate meaningful exception when something goes wrong. + */ + + protected static final String getString( final Map< Object, Object > mapping, final String key ) + { + return getStringOrDefault( mapping, key, null ); + } + + protected static final String getStringOrDefault( final Map< Object, Object > mapping, final String key, final String defaultValue ) + { + return getOrDefault( mapping, key, String.class, defaultValue ); + } + + protected static final int getInt( final Map< Object, Object > mapping, final String key ) + { + return getOrDefault( mapping, key, Number.class, null ).intValue(); + } + + protected static final int getIntOrDefault( final Map< Object, Object > mapping, final String key, final int defaultValue ) + { + return getOrDefault( mapping, key, Number.class, defaultValue ).intValue(); + } + + protected static final double getDouble( final Map< Object, Object > mapping, final String key ) + { + return getOrDefault( mapping, key, Number.class, null ).doubleValue(); + } + + protected static final double getDoubleOrDefault( final Map< Object, Object > mapping, final String key, final double defaultValue ) + { + return getOrDefault( mapping, key, Number.class, defaultValue ).doubleValue(); + } + + protected static final float getFloat( final Map< Object, Object > mapping, final String key ) + { + return getOrDefault( mapping, key, Number.class, null ).floatValue(); + } + + protected static final float getFloatOrDefault( final Map< Object, Object > mapping, final String key, final float defaultValue ) + { + return getOrDefault( mapping, key, Number.class, defaultValue ).floatValue(); + } + + protected static final boolean getBoolean( final Map< Object, Object > mapping, final String key ) + { + return getOrDefault( mapping, key, Boolean.class, null ); + } + + protected static final boolean getBooleanOrDefault( final Map< Object, Object > mapping, final String key, final boolean defaultValue ) + { + return getOrDefault( mapping, key, Boolean.class, defaultValue ); + } + + + @SuppressWarnings( "unchecked" ) + protected static final < T > T getOrDefault( final Map< Object, Object > mapping, final String key, final Class< T > klass, final T defaultValue ) + { + final Object obj = mapping.getOrDefault( key, defaultValue ); + if ( obj == null ) + throw new YAMLException( "Could not find value for required parameter '" + key + "'." ); + + if ( klass.isInstance( obj ) ) + return ( T ) obj; + else + throw new YAMLException( "Incorrect value class for parameter '" + key + + "'. Expected " + klass.getSimpleName() + + " but found " + obj.getClass().getSimpleName() + "." ); + } + } diff --git a/src/main/java/org/mastodon/ui/coloring/feature/FeatureColorModeIO.java b/src/main/java/org/mastodon/ui/coloring/feature/FeatureColorModeIO.java index 02a950e81..da6179ef4 100644 --- a/src/main/java/org/mastodon/ui/coloring/feature/FeatureColorModeIO.java +++ b/src/main/java/org/mastodon/ui/coloring/feature/FeatureColorModeIO.java @@ -28,6 +28,8 @@ */ package org.mastodon.ui.coloring.feature; +import static org.yaml.snakeyaml.DumperOptions.FlowStyle.FLOW; + import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -46,8 +48,6 @@ import org.yaml.snakeyaml.nodes.Tag; import org.yaml.snakeyaml.representer.Representer; -import static org.yaml.snakeyaml.DumperOptions.FlowStyle.FLOW; - public class FeatureColorModeIO { private static class FeatureColorModeRepresenter extends WorkaroundRepresenter @@ -115,11 +115,12 @@ public Object construct( final Node node ) try { final Map< Object, Object > mapping = constructMapping( ( MappingNode ) node ); - final String featureKey = ( String ) mapping.get( "feature" ); - final String projectionKey = ( String ) mapping.get( "projection" ); - final TargetType targetType = TargetType.valueOf( ( String ) mapping.get( "target" ) ); - final int i0 = ( Integer ) mapping.get( "i0" ); - final int i1 = ( Integer ) mapping.get( "i1" ); + final String featureKey = getString( mapping, "feature" ); + final String projectionKey = getString( mapping, "projection" ); + final String targetStr = getString( mapping, "target" ); + final TargetType targetType = TargetType.valueOf( targetStr ); + final int i0 = getInt( mapping, "i0" ); + final int i1 = getInt( mapping, "i1" ); return new FeatureProjectionId( featureKey, projectionKey, targetType, i0, i1 ); } catch ( final Exception e ) @@ -174,18 +175,18 @@ public Object construct( final Node node ) try { final Map< Object, Object > mapping = constructMapping( ( MappingNode ) node ); - final String name = ( String ) mapping.get( "name" ); + final String name = getString( mapping, "name" ); final FeatureColorMode s = FeatureColorMode.defaultMode().copy( name ); - s.setVertexColorMode( VertexColorMode.valueOf( ( String ) mapping.get( "vertexColorMode" ) ) ); + s.setVertexColorMode( VertexColorMode.valueOf( getString( mapping, "vertexColorMode" ) ) ); s.setVertexFeatureProjection( ( FeatureProjectionId ) mapping.get( "vertexFeatureProjection" ) ); - s.setVertexColorMap( ( String ) mapping.get( "vertexColorMap" ) ); + s.setVertexColorMap( getString( mapping, "vertexColorMap" ) ); @SuppressWarnings( "unchecked" ) final List< Double > vertexRange = ( List< Double > ) mapping.get( "vertexFeatureRange" ); s.setVertexRange( vertexRange.get( 0 ), vertexRange.get( 1 ) ); - s.setEdgeColorMode( EdgeColorMode.valueOf( ( String ) mapping.get( "edgeColorMode" ) ) ); + s.setEdgeColorMode( EdgeColorMode.valueOf( getString( mapping, "edgeColorMode" ) ) ); s.setEdgeFeatureProjection( ( FeatureProjectionId ) mapping.get( "edgeFeatureProjection" ) ); - s.setEdgeColorMap( ( String ) mapping.get( "edgeColorMap" ) ); + s.setEdgeColorMap( getString( mapping, "edgeColorMap" ) ); @SuppressWarnings( "unchecked" ) final List< Double > edgeRange = ( List< Double > ) mapping.get( "edgeFeatureRange" ); s.setEdgeRange( edgeRange.get( 0 ), edgeRange.get( 1 ) ); diff --git a/src/main/java/org/mastodon/views/bdv/overlay/ui/RenderSettingsIO.java b/src/main/java/org/mastodon/views/bdv/overlay/ui/RenderSettingsIO.java index fb904898a..3ed5e47c8 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/ui/RenderSettingsIO.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/ui/RenderSettingsIO.java @@ -223,47 +223,30 @@ public Object construct( final Node node ) final String name = ( String ) mapping.get( "name" ); final RenderSettings s = RenderSettings.defaultStyle().copy( name ); - s.setName( ( String ) mapping.getOrDefault( "name", "CouldNotFindName" ) ); + s.setName( getStringOrDefault( mapping, "name", "CouldNotFindName" ) ); - s.setUseAntialiasing( - ( boolean ) mapping.getOrDefault( "antialiasing", RenderSettings.DEFAULT_USE_ANTI_ALIASING ) ); - s.setDrawLinks( ( boolean ) mapping.getOrDefault( "drawLinks", RenderSettings.DEFAULT_DRAW_LINKS ) ); - s.setDrawLinksAheadInTime( ( boolean ) mapping.getOrDefault( "drawLinksAheadInTime", - RenderSettings.DEFAULT_DRAW_LINKS_AHEAD_IN_TIME ) ); - s.setDrawArrowHeads( - ( boolean ) mapping.getOrDefault( "drawArrowHeads", RenderSettings.DEFAULT_DRAW_ARROW_HEADS ) ); - s.setTimeLimit( - ( int ) mapping.getOrDefault( "timeRangeForLinks", RenderSettings.DEFAULT_LIMIT_TIME_RANGE ) ); - s.setUseGradient( - ( boolean ) mapping.getOrDefault( "gradientForLinks", RenderSettings.DEFAULT_USE_GRADIENT ) ); - s.setDrawSpots( ( boolean ) mapping.getOrDefault( "drawSpots", RenderSettings.DEFAULT_DRAW_SPOTS ) ); - s.setDrawEllipsoidSliceIntersection( ( boolean ) mapping.getOrDefault( "drawEllipsoidIntersection", - RenderSettings.DEFAULT_DRAW_SLICE_INTERSECTION ) ); - s.setDrawEllipsoidSliceProjection( ( boolean ) mapping.getOrDefault( "drawEllipsoidProjection", - RenderSettings.DEFAULT_DRAW_SLICE_PROJECTION ) ); - s.setDrawSpotCenters( - ( boolean ) mapping.getOrDefault( "drawSpotCenters", RenderSettings.DEFAULT_DRAW_POINTS ) ); - s.setDrawSpotCentersForEllipses( ( boolean ) mapping.getOrDefault( "drawSpotCentersForEllipses", - RenderSettings.DEFAULT_DRAW_POINTS_FOR_ELLIPSE ) ); - s.setDrawSpotLabels( - ( boolean ) mapping.getOrDefault( "drawSpotLabels", RenderSettings.DEFAULT_DRAW_SPOT_LABELS ) ); - s.setFillSpots( ( boolean ) mapping.getOrDefault( "fillSpots", RenderSettings.DEFAULT_FILL_SPOTS ) ); - s.setFocusLimit( - ( double ) mapping.getOrDefault( "focusLimit", RenderSettings.DEFAULT_LIMIT_FOCUS_RANGE ) ); - s.setFocusLimitViewRelative( ( boolean ) mapping.getOrDefault( "focusLimitViewRelative", - RenderSettings.DEFAULT_IS_FOCUS_LIMIT_RELATIVE ) ); - s.setEllipsoidFadeDepth( ( double ) mapping.getOrDefault( "ellipsoidFadeDepth", - RenderSettings.DEFAULT_ELLIPSOID_FADE_DEPTH ) ); - s.setPointFadeDepth( - ( double ) mapping.getOrDefault( "pointFadeDepth", RenderSettings.DEFAULT_POINT_FADE_DEPTH ) ); - s.setSpotStrokeWidth( ( double ) mapping.getOrDefault( "spotStrokeWidth", - RenderSettings.DEFAULT_SPOT_STROKE_WIDTH ) ); - s.setLinkStrokeWidth( ( double ) mapping.getOrDefault( "linkStrokeWidth", - RenderSettings.DEFAULT_LINK_STROKE_WIDTH ) ); - s.setColorSpot( - ( int ) mapping.getOrDefault( "colorSpot", RenderSettings.DEFAULT_COLOR_SPOT_AND_PRESENT ) ); - s.setColorPast( ( int ) mapping.getOrDefault( "colorPast", RenderSettings.DEFAULT_COLOR_PAST ) ); - s.setColorFuture( ( int ) mapping.getOrDefault( "colorFuture", RenderSettings.DEFAULT_COLOR_FUTURE ) ); + s.setUseAntialiasing( getBooleanOrDefault( mapping, "antialiasing", RenderSettings.DEFAULT_USE_ANTI_ALIASING ) ); + s.setDrawLinks( getBooleanOrDefault( mapping, "drawLinks", RenderSettings.DEFAULT_DRAW_LINKS ) ); + s.setDrawLinksAheadInTime( getBooleanOrDefault( mapping, "drawLinksAheadInTime", RenderSettings.DEFAULT_DRAW_LINKS_AHEAD_IN_TIME ) ); + s.setDrawArrowHeads( getBooleanOrDefault( mapping, "drawArrowHeads", RenderSettings.DEFAULT_DRAW_ARROW_HEADS ) ); + s.setTimeLimit( getIntOrDefault( mapping, "timeRangeForLinks", RenderSettings.DEFAULT_LIMIT_TIME_RANGE ) ); + s.setUseGradient( getBooleanOrDefault( mapping, "gradientForLinks", RenderSettings.DEFAULT_USE_GRADIENT ) ); + s.setDrawSpots( getBooleanOrDefault( mapping, "drawSpots", RenderSettings.DEFAULT_DRAW_SPOTS ) ); + s.setDrawEllipsoidSliceIntersection( getBooleanOrDefault( mapping, "drawEllipsoidIntersection", RenderSettings.DEFAULT_DRAW_SLICE_INTERSECTION ) ); + s.setDrawEllipsoidSliceProjection( getBooleanOrDefault( mapping, "drawEllipsoidProjection", RenderSettings.DEFAULT_DRAW_SLICE_PROJECTION ) ); + s.setDrawSpotCenters( getBooleanOrDefault( mapping, "drawSpotCenters", RenderSettings.DEFAULT_DRAW_POINTS ) ); + s.setDrawSpotCentersForEllipses( getBooleanOrDefault( mapping, "drawSpotCentersForEllipses", RenderSettings.DEFAULT_DRAW_POINTS_FOR_ELLIPSE ) ); + s.setDrawSpotLabels( getBooleanOrDefault( mapping, "drawSpotLabels", RenderSettings.DEFAULT_DRAW_SPOT_LABELS ) ); + s.setFillSpots( getBooleanOrDefault( mapping, "fillSpots", RenderSettings.DEFAULT_FILL_SPOTS ) ); + s.setFocusLimit( getDoubleOrDefault( mapping, "focusLimit", RenderSettings.DEFAULT_LIMIT_FOCUS_RANGE ) ); + s.setFocusLimitViewRelative( getBooleanOrDefault( mapping, "focusLimitViewRelative", RenderSettings.DEFAULT_IS_FOCUS_LIMIT_RELATIVE ) ); + s.setEllipsoidFadeDepth( getDoubleOrDefault( mapping, "ellipsoidFadeDepth", RenderSettings.DEFAULT_ELLIPSOID_FADE_DEPTH ) ); + s.setPointFadeDepth( getDoubleOrDefault( mapping, "pointFadeDepth", RenderSettings.DEFAULT_POINT_FADE_DEPTH ) ); + s.setSpotStrokeWidth( getDoubleOrDefault( mapping, "spotStrokeWidth", RenderSettings.DEFAULT_SPOT_STROKE_WIDTH ) ); + s.setLinkStrokeWidth( getDoubleOrDefault( mapping, "linkStrokeWidth", RenderSettings.DEFAULT_LINK_STROKE_WIDTH ) ); + s.setColorSpot( getIntOrDefault( mapping, "colorSpot", RenderSettings.DEFAULT_COLOR_SPOT_AND_PRESENT ) ); + s.setColorPast( getIntOrDefault( mapping, "colorPast", RenderSettings.DEFAULT_COLOR_PAST ) ); + s.setColorFuture( getIntOrDefault( mapping, "colorFuture", RenderSettings.DEFAULT_COLOR_FUTURE ) ); return s; } diff --git a/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleIO.java b/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleIO.java index 80f6df8ac..5f27d27da 100644 --- a/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleIO.java +++ b/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleIO.java @@ -325,24 +325,19 @@ public Object construct( final Node node ) final DataDisplayStyle s = DataDisplayStyle.defaultStyle().copy( name ); final DataDisplayStyle df = DataDisplayStyle.defaultStyle(); - s.autoVertexSize( ( boolean ) mapping.getOrDefault( "autoVertexSize", df.isAutoVertexSize() ) ); - s.vertexFixedSize( ( double ) mapping.getOrDefault( "vertexFixedSize", df.getVertexFixedSize() ) ); - s.vertexDrawShape( VertexDrawShape.valueOf( - ( String ) mapping.getOrDefault( "vertexDrawShape", df.getVertexDrawShape().name() ) ) ); + s.autoVertexSize( getBooleanOrDefault( mapping, "autoVertexSize", df.isAutoVertexSize() ) ); + s.vertexFixedSize( getDoubleOrDefault( mapping, "vertexFixedSize", df.getVertexFixedSize() ) ); + s.vertexDrawShape( VertexDrawShape.valueOf( getStringOrDefault( mapping, "vertexDrawShape", df.getVertexDrawShape().name() ) ) ); s.edgeColor( ( Color ) mapping.getOrDefault( "edgeColor", df.getEdgeColor() ) ); s.vertexFillColor( ( Color ) mapping.getOrDefault( "vertexFillColor", df.getVertexFillColor() ) ); s.vertexDrawColor( ( Color ) mapping.getOrDefault( "vertexDrawColor", df.getVertexDrawColor() ) ); - s.selectedVertexFillColor( - ( Color ) mapping.getOrDefault( "selectedVertexFillColor", df.getSelectedVertexFillColor() ) ); + s.selectedVertexFillColor( ( Color ) mapping.getOrDefault( "selectedVertexFillColor", df.getSelectedVertexFillColor() ) ); s.selectedEdgeColor( ( Color ) mapping.getOrDefault( "selectedEdgeColor", df.getSelectedEdgeColor() ) ); - s.selectedVertexDrawColor( - ( Color ) mapping.getOrDefault( "selectedVertexDrawColor", df.getSelectedVertexDrawColor() ) ); - s.simplifiedVertexFillColor( ( Color ) mapping.getOrDefault( "simplifiedVertexFillColor", - df.getSimplifiedVertexFillColor() ) ); - s.selectedSimplifiedVertexFillColor( ( Color ) mapping.getOrDefault( - "selectedSimplifiedVertexFillColor", df.getSelectedSimplifiedVertexFillColor() ) ); + s.selectedVertexDrawColor( ( Color ) mapping.getOrDefault( "selectedVertexDrawColor", df.getSelectedVertexDrawColor() ) ); + s.simplifiedVertexFillColor( ( Color ) mapping.getOrDefault( "simplifiedVertexFillColor", df.getSimplifiedVertexFillColor() ) ); + s.selectedSimplifiedVertexFillColor( ( Color ) mapping.getOrDefault( "selectedSimplifiedVertexFillColor", df.getSelectedSimplifiedVertexFillColor() ) ); s.backgroundColor( ( Color ) mapping.getOrDefault( "backgroundColor", df.getBackgroundColor() ) ); s.axisColor( ( Color ) mapping.getOrDefault( "axisColor", df.getAxisColor() ) ); @@ -353,14 +348,12 @@ public Object construct( final Node node ) s.axisStroke( ( Stroke ) mapping.getOrDefault( "axisStroke", df.getAxisStroke() ) ); s.edgeStroke( ( Stroke ) mapping.getOrDefault( "edgeStroke", df.getEdgeStroke() ) ); - s.edgeHighlightStroke( - ( Stroke ) mapping.getOrDefault( "edgeHighlightStroke", df.getEdgeHighlightStroke() ) ); + s.edgeHighlightStroke( ( Stroke ) mapping.getOrDefault( "edgeHighlightStroke", df.getEdgeHighlightStroke() ) ); s.vertexStroke( ( Stroke ) mapping.getOrDefault( "vertexStroke", df.getVertexStroke() ) ); - s.vertexHighlightStroke( - ( Stroke ) mapping.getOrDefault( "vertexHighlightStroke", df.getVertexHighlightStroke() ) ); + s.vertexHighlightStroke( ( Stroke ) mapping.getOrDefault( "vertexHighlightStroke", df.getVertexHighlightStroke() ) ); s.focusStroke( ( Stroke ) mapping.getOrDefault( "focusStroke", df.getFocusStroke() ) ); - s.drawVertexName( ( boolean ) mapping.getOrDefault( "drawVertexName", df.isDrawVertexName() ) ); + s.drawVertexName( getBooleanOrDefault( mapping, "drawVertexName", df.isDrawVertexName() ) ); return s; } diff --git a/src/main/java/org/mastodon/views/trackscheme/display/style/TrackSchemeStyleIO.java b/src/main/java/org/mastodon/views/trackscheme/display/style/TrackSchemeStyleIO.java index 57c8dc7e8..982dd1b39 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/style/TrackSchemeStyleIO.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/style/TrackSchemeStyleIO.java @@ -80,7 +80,6 @@ public TrackschemeStyleConstructor() } } - public // TODO? static Yaml createYaml() { final DumperOptions dumperOptions = new DumperOptions(); @@ -182,10 +181,10 @@ public Object construct( final Node node ) try { final Map< Object, Object > mapping = constructMapping( ( MappingNode ) node ); - final float width = ( ( Double ) mapping.get( "width" ) ).floatValue(); - final int cap = ( Integer ) mapping.get( "cap" ); - final int join = ( Integer ) mapping.get( "join" ); - final float miterlimit = ( ( Double ) mapping.get( "miterlimit" ) ).floatValue(); + final float width = getFloat( mapping, "width" ); + final int cap = getInt( mapping, "cap" ); + final int join = getInt( mapping, "join" ); + final float miterlimit = getFloat( mapping, "miterlimit" ); @SuppressWarnings( "unchecked" ) final List< Double > list = ( List< Double > ) mapping.get( "dash" ); float[] dash = null; @@ -196,7 +195,7 @@ public Object construct( final Node node ) for ( final double d : list ) dash[ i++ ] = ( float ) d; } - final float dash_phase = ( ( Double ) mapping.get( "dash_phase" ) ).floatValue(); + final float dash_phase = getFloat( mapping, "dash_phase" ); return new BasicStroke( width, cap, join, miterlimit, dash, dash_phase ); } catch ( final Exception e ) @@ -242,9 +241,9 @@ public Object construct( final Node node ) try { final Map< Object, Object > mapping = constructMapping( ( MappingNode ) node ); - final String name = ( String ) mapping.get( "name" ); - final int style = ( Integer ) mapping.get( "style" ); - final int size = ( Integer ) mapping.get( "size" ); + final String name = getString( mapping, "name" ); + final int style = getInt( mapping, "style" ); + final int size = getInt( mapping, "size" ); return new Font( name, style, size ); } catch ( final Exception e ) @@ -333,68 +332,48 @@ public Object construct( final Node node ) try { final Map< Object, Object > mapping = constructMapping( ( MappingNode ) node ); - final String name = ( String ) mapping.getOrDefault( "name", "NameNotFound" ); + final String name = getStringOrDefault( mapping, "name", "NameNotFound" ); final TrackSchemeStyle s = TrackSchemeStyle.defaultStyle().copy( name ); final TrackSchemeStyle df = TrackSchemeStyle.defaultStyle(); s.edgeColor( ( Color ) mapping.getOrDefault( "edgeColor", df.getEdgeColor() ) ); s.vertexFillColor( ( Color ) mapping.getOrDefault( "vertexFillColor", df.getVertexFillColor() ) ); s.vertexDrawColor( ( Color ) mapping.getOrDefault( "vertexDrawColor", df.getVertexDrawColor() ) ); - s.selectedVertexFillColor( - ( Color ) mapping.getOrDefault( "selectedVertexFillColor", df.getSelectedVertexFillColor() ) ); + s.selectedVertexFillColor( ( Color ) mapping.getOrDefault( "selectedVertexFillColor", df.getSelectedVertexFillColor() ) ); s.selectedEdgeColor( ( Color ) mapping.getOrDefault( "selectedEdgeColor", df.getSelectedEdgeColor() ) ); - s.selectedVertexDrawColor( - ( Color ) mapping.getOrDefault( "selectedVertexDrawColor", df.getSelectedVertexDrawColor() ) ); - s.simplifiedVertexFillColor( ( Color ) mapping.getOrDefault( "simplifiedVertexFillColor", - df.getSimplifiedVertexFillColor() ) ); - s.selectedSimplifiedVertexFillColor( ( Color ) mapping.getOrDefault( - "selectedSimplifiedVertexFillColor", df.getSelectedSimplifiedVertexFillColor() ) ); + s.selectedVertexDrawColor( ( Color ) mapping.getOrDefault( "selectedVertexDrawColor", df.getSelectedVertexDrawColor() ) ); + s.simplifiedVertexFillColor( ( Color ) mapping.getOrDefault( "simplifiedVertexFillColor", df.getSimplifiedVertexFillColor() ) ); + s.selectedSimplifiedVertexFillColor( ( Color ) mapping.getOrDefault( "selectedSimplifiedVertexFillColor", df.getSelectedSimplifiedVertexFillColor() ) ); s.backgroundColor( ( Color ) mapping.getOrDefault( "backgroundColor", df.getBackgroundColor() ) ); - s.currentTimepointColor( - ( Color ) mapping.getOrDefault( "currentTimepointColor", df.getCurrentTimepointColor() ) ); + s.currentTimepointColor( ( Color ) mapping.getOrDefault( "currentTimepointColor", df.getCurrentTimepointColor() ) ); s.decorationColor( ( Color ) mapping.getOrDefault( "decorationColor", df.getDecorationColor() ) ); s.vertexRangeColor( ( Color ) mapping.getOrDefault( "vertexRangeColor", df.getVertexRangeColor() ) ); - s.headerBackgroundColor( - ( Color ) mapping.getOrDefault( "headerBackgroundColor", df.getHeaderBackgroundColor() ) ); - s.headerDecorationColor( - ( Color ) mapping.getOrDefault( "headerDecorationColor", df.getHeaderDecorationColor() ) ); - s.headerCurrentTimepointColor( ( Color ) mapping.getOrDefault( "headerCurrentTimepointColor", - df.getCurrentTimepointColor() ) ); + s.headerBackgroundColor( ( Color ) mapping.getOrDefault( "headerBackgroundColor", df.getHeaderBackgroundColor() ) ); + s.headerDecorationColor( ( Color ) mapping.getOrDefault( "headerDecorationColor", df.getHeaderDecorationColor() ) ); + s.headerCurrentTimepointColor( ( Color ) mapping.getOrDefault( "headerCurrentTimepointColor", df.getCurrentTimepointColor() ) ); s.font( ( Font ) mapping.getOrDefault( "font", df.getFont() ) ); s.headerFont( ( Font ) mapping.getOrDefault( "headerFont", df.getHeaderFont() ) ); s.edgeStroke( ( Stroke ) mapping.getOrDefault( "edgeStroke", df.getEdgeStroke() ) ); s.edgeGhostStroke( ( Stroke ) mapping.getOrDefault( "edgeGhostStroke", df.getEdgeGhostStroke() ) ); - s.edgeHighlightStroke( - ( Stroke ) mapping.getOrDefault( "edgeHighlightStroke", df.getEdgeHighlightStroke() ) ); + s.edgeHighlightStroke( ( Stroke ) mapping.getOrDefault( "edgeHighlightStroke", df.getEdgeHighlightStroke() ) ); s.vertexStroke( ( Stroke ) mapping.getOrDefault( "vertexStroke", df.getVertexStroke() ) ); - s.vertexGhostStroke( - ( Stroke ) mapping.getOrDefault( "vertexGhostStroke", df.getVertexGhostStroke() ) ); - s.vertexHighlightStroke( - ( Stroke ) mapping.getOrDefault( "vertexHighlightStroke", df.getVertexHighlightStroke() ) ); + s.vertexGhostStroke( ( Stroke ) mapping.getOrDefault( "vertexGhostStroke", df.getVertexGhostStroke() ) ); + s.vertexHighlightStroke( ( Stroke ) mapping.getOrDefault( "vertexHighlightStroke", df.getVertexHighlightStroke() ) ); s.focusStroke( ( Stroke ) mapping.getOrDefault( "focusStroke", df.getFocusStroke() ) ); - s.branchGraphEdgeStroke( - ( Stroke ) mapping.getOrDefault( "branchGraphEdgeStroke", df.getBranchGraphEdgeStroke() ) ); - s.branchGraphEdgeHighlightStroke( ( Stroke ) mapping.getOrDefault( "branchGraphEdgeHighlightStroke", - df.getBranchGraphEdgeHighlightStroke() ) ); - s.hierarchyEdgeStroke( - ( Stroke ) mapping.getOrDefault( "hierarchyEdgeStroke", df.getHierarchyEdgeStroke() ) ); - s.hierarchyEdgeHighlightStroke( ( Stroke ) mapping.getOrDefault( "hierarchyEdgeHighlightStroke", - df.getHierarchyEdgeHighlightStroke() ) ); - s.hierarchyVertexStroke( - ( Stroke ) mapping.getOrDefault( "hierarchyVertexStroke", df.getHierarchyVertexStroke() ) ); - s.hierarchyVertexHighlightStroke( ( Stroke ) mapping.getOrDefault( "hierarchyVertexHighlightStroke", - df.getHierarchyVertexHighlightStroke() ) ); - - s.hierarchyGraphCurvedLines( ( boolean ) mapping.getOrDefault( "hierarchyGraphCurvedLines", - df.isHierarchyGraphCurvedLines() ) ); - s.highlightCurrentTimepoint( ( boolean ) mapping.getOrDefault( "highlightCurrentTimepoint", - df.isHighlightCurrentTimepoint() ) ); - s.paintRows( ( boolean ) mapping.getOrDefault( "paintRows", df.isPaintRows() ) ); - s.paintColumns( ( boolean ) mapping.getOrDefault( "paintColumns", df.isPaintColumns() ) ); - s.paintHeaderShadow( - ( boolean ) mapping.getOrDefault( "paintHeaderShadow", df.isPaintHeaderShadow() ) ); + s.branchGraphEdgeStroke( ( Stroke ) mapping.getOrDefault( "branchGraphEdgeStroke", df.getBranchGraphEdgeStroke() ) ); + s.branchGraphEdgeHighlightStroke( ( Stroke ) mapping.getOrDefault( "branchGraphEdgeHighlightStroke", df.getBranchGraphEdgeHighlightStroke() ) ); + s.hierarchyEdgeStroke( ( Stroke ) mapping.getOrDefault( "hierarchyEdgeStroke", df.getHierarchyEdgeStroke() ) ); + s.hierarchyEdgeHighlightStroke( ( Stroke ) mapping.getOrDefault( "hierarchyEdgeHighlightStroke", df.getHierarchyEdgeHighlightStroke() ) ); + s.hierarchyVertexStroke( ( Stroke ) mapping.getOrDefault( "hierarchyVertexStroke", df.getHierarchyVertexStroke() ) ); + s.hierarchyVertexHighlightStroke( ( Stroke ) mapping.getOrDefault( "hierarchyVertexHighlightStroke", df.getHierarchyVertexHighlightStroke() ) ); + + s.hierarchyGraphCurvedLines( getBooleanOrDefault( mapping, "hierarchyGraphCurvedLines", df.isHierarchyGraphCurvedLines() ) ); + s.highlightCurrentTimepoint( getBooleanOrDefault( mapping, "highlightCurrentTimepoint", df.isHighlightCurrentTimepoint() ) ); + s.paintRows( getBooleanOrDefault( mapping, "paintRows", df.isPaintRows() ) ); + s.paintColumns( getBooleanOrDefault( mapping, "paintColumns", df.isPaintColumns() ) ); + s.paintHeaderShadow( getBooleanOrDefault( mapping, "paintHeaderShadow", df.isPaintHeaderShadow() ) ); return s; } From 06893eb08afc56a5d17c112e04da7d91480dd0bf Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 13:34:18 +0200 Subject: [PATCH 053/220] Better error messages when we cannot open the project.xml file. --- .../java/org/mastodon/mamut/io/project/MamutProjectIO.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java b/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java index 5839ea4b6..94f729e94 100644 --- a/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java +++ b/src/main/java/org/mastodon/mamut/io/project/MamutProjectIO.java @@ -126,12 +126,14 @@ public static final MamutProject load( final String projectPath ) throws IOExcep } catch ( final JDOMException e ) { - throw new IOException( e ); + throw new IOException( "Problem with the " + MamutProject.PROJECT_FILE_NAME + " file:\n" + + e.getMessage() ); } final Element root = doc.getRootElement(); if ( !MAMUTPROJECT_TAG.equals( root.getName() ) ) - throw new IOException( "expected <" + MAMUTPROJECT_TAG + "> root element. wrong file?" ); + throw new IOException( "Problem with the " + MamutProject.PROJECT_FILE_NAME + " file:\n" + + "Expected the root element to be <" + MAMUTPROJECT_TAG + "> but got <" + root.getName() + ">. Wrong file?" ); fromXml( project, root ); From b2aed832cf81a33cc09d5dc0662846b922b084af Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 13:34:33 +0200 Subject: [PATCH 054/220] The launcher log panel should not be editable. --- src/main/java/org/mastodon/mamut/launcher/LauncherGUI.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/mastodon/mamut/launcher/LauncherGUI.java b/src/main/java/org/mastodon/mamut/launcher/LauncherGUI.java index 5f40b4e2e..44a9b15e6 100644 --- a/src/main/java/org/mastodon/mamut/launcher/LauncherGUI.java +++ b/src/main/java/org/mastodon/mamut/launcher/LauncherGUI.java @@ -247,6 +247,7 @@ public LoggerPanel() super( new BorderLayout() ); this.textPane = new JTextPane(); textPane.setOpaque( false ); + textPane.setEditable( false ); add( textPane, BorderLayout.CENTER ); } } From e7ecd3d96162e84db8a4b551c37c689769099d47 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 13:36:15 +0200 Subject: [PATCH 055/220] Make it possible to recuperate when we cannot find the image data file. Before this commit, if the BDV XML file pointed to a missing image data file (H5) or to a remote URL that cannot be reached, the launcher would crash and block. Now it generates an error message, and the launcher offers to open dummy data instead. --- .../views/bdv/SharedBigDataViewerData.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java index 071884f32..9869dcf55 100644 --- a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java +++ b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java @@ -75,6 +75,7 @@ import ij.io.FileInfo; import ij.process.LUT; import mpicbg.spim.data.SpimDataException; +import mpicbg.spim.data.SpimDataIOException; import mpicbg.spim.data.XmlHelpers; import mpicbg.spim.data.generic.AbstractSpimData; import mpicbg.spim.data.generic.sequence.AbstractSequenceDescription; @@ -400,8 +401,17 @@ private boolean computeIs2D() public static SharedBigDataViewerData fromSpimDataXmlFile( final String spimDataXmlFilename ) throws SpimDataException { - final AbstractSpimData< ? > spimData = new XmlIoSpimDataMinimal().load( spimDataXmlFilename ); - return fromSpimData( spimDataXmlFilename, spimData ); + try + { + final AbstractSpimData< ? > spimData = new XmlIoSpimDataMinimal().load( spimDataXmlFilename ); + return fromSpimData( spimDataXmlFilename, spimData ); + } + catch ( final RuntimeException e ) + { + if ( FileNotFoundException.class.isInstance( e.getCause() ) ) + throw new SpimDataIOException( "Could not find the image data file:\n" + e.getMessage() ); + } + return null; } public static SharedBigDataViewerData fromDummyFilename( final String spimDataXmlFilename ) From 266f086ae35760502df4542e4eb056e3302897d5 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 15:46:04 +0200 Subject: [PATCH 056/220] Rework interactive project opening, local or remote. - Interactive methods are now in LauncherUtil, not in ProjectLoader any more. - They do not throw any exceptions, but know how to return a user- readable error message. - The launcher uses these methods, and display the error messages when something wrong happens. --- .../org/mastodon/mamut/io/ProjectActions.java | 34 +- .../org/mastodon/mamut/io/ProjectCreator.java | 83 +--- .../mastodon/mamut/io/ProjectImporter.java | 26 +- .../org/mastodon/mamut/io/ProjectLoader.java | 267 ------------ .../mastodon/mamut/launcher/LauncherGUI.java | 62 ++- .../mastodon/mamut/launcher/LauncherUtil.java | 403 +++++++++++++++++- .../mamut/launcher/MastodonDndLauncher.java | 3 +- .../mamut/launcher/MastodonLauncher.java | 148 +++---- .../mamut/launcher/OpenRemoteURLPanel.java | 2 +- .../views/bdv/SharedBigDataViewerData.java | 10 +- 10 files changed, 545 insertions(+), 493 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectActions.java b/src/main/java/org/mastodon/mamut/io/ProjectActions.java index 41ce4ad90..621a5ebb9 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectActions.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectActions.java @@ -2,9 +2,13 @@ import java.awt.Component; import java.awt.Frame; +import java.util.function.Consumer; + +import javax.swing.JOptionPane; import org.mastodon.mamut.KeyConfigScopes; import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.launcher.LauncherUtil; import org.mastodon.ui.keymap.KeyConfigContexts; import org.scijava.Context; import org.scijava.plugin.Plugin; @@ -46,10 +50,11 @@ public class ProjectActions */ public static void installGlobalActions( final Actions actions, final Context context, final Component parentComponent ) { - final RunnableAction createProjectAction = new RunnableAction( CREATE_PROJECT, () -> ProjectCreator.createProjectWithDialog( context, parentComponent ) ); - final RunnableAction createProjectFromUrlAction = new RunnableAction( CREATE_PROJECT_FROM_URL, () -> ProjectCreator.createProjectFromUrl( context, parentComponent ) ); - final RunnableAction loadProjectAction = new RunnableAction( LOAD_PROJECT, () -> ProjectLoader.openWithDialog( context, parentComponent ) ); - final RunnableAction importMamutAction = new RunnableAction( IMPORT_MAMUT, () -> ProjectImporter.openMamutWithDialog( parentComponent, context ) ); + final BasicErrorLogger errorLogger = new BasicErrorLogger( parentComponent ); + final RunnableAction createProjectAction = new RunnableAction( CREATE_PROJECT, () -> LauncherUtil.createProjectWithDialog( context, parentComponent, errorLogger ) ); + final RunnableAction createProjectFromUrlAction = new RunnableAction( CREATE_PROJECT_FROM_URL, () -> ProjectCreator.createProjectFromUrl( context, parentComponent, errorLogger ) ); + final RunnableAction loadProjectAction = new RunnableAction( LOAD_PROJECT, () -> LauncherUtil.openWithDialog( context, parentComponent, errorLogger ) ); + final RunnableAction importMamutAction = new RunnableAction( IMPORT_MAMUT, () -> ProjectImporter.openMamutWithDialog( parentComponent, context, errorLogger ) ); actions.namedAction( createProjectAction, CREATE_PROJECT_KEYS ); actions.namedAction( createProjectFromUrlAction, CREATE_PROJECT_FROM_URL_KEYS ); @@ -99,4 +104,25 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) descriptions.add( EXPORT_MAMUT, EXPORT_MAMUT_KEYS, "Export current project as a MaMuT project." ); } } + + private static final class BasicErrorLogger implements Consumer< String > + { + + private final Component parent; + + public BasicErrorLogger( final Component parent ) + { + this.parent = parent; + } + + @Override + public void accept( final String error ) + { + JOptionPane.showMessageDialog( + parent, + "Problem reading Mastodon file:\n" + error, + "Error reading Mastodon file", + JOptionPane.ERROR_MESSAGE ); + } + }; } diff --git a/src/main/java/org/mastodon/mamut/io/ProjectCreator.java b/src/main/java/org/mastodon/mamut/io/ProjectCreator.java index cd8e77964..c5040d0cb 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectCreator.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectCreator.java @@ -6,6 +6,7 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.function.Consumer; import javax.swing.JLabel; import javax.swing.JOptionPane; @@ -32,83 +33,6 @@ public class ProjectCreator { - /** - * Interactively creates a new project prompting the user for a path to a - * BDV/XML file. - *

    - * A dialog is shown to prompt the user for the path to the XML file. If the - * image data cannot be loaded a dialog shows up telling the user about the - * problem, and offering to start Mastodon on substituted dummy image data. - * - * @param context - * the current context. - * @param parentComponent - * a component to use as parent to show dialogs during opening. - * Can be null. - * @return a new {@link ProjectModel} or null if the user - * clicked cancel, or if the BDV file is faulty and the user - * declined to substitute a dummy dataset. - */ - public static synchronized ProjectModel createProjectWithDialog( final Context context, final Component parentComponent ) - { - final File file = FileChooser.chooseFile( - parentComponent, - null, - new XmlFileFilter(), - "Open BigDataViewer File", - FileChooser.DialogType.LOAD, - NEW_ICON_MEDIUM.getImage() ); - if ( file == null ) - return null; - - try - { - return createProjectFromBdvFileWithDialog( file, context, parentComponent ); - } - catch ( final SpimDataException e ) - { - JOptionPane.showMessageDialog( - parentComponent, - "Problem reading image file:\n" + e.getMessage(), - "Error reading image data", - JOptionPane.ERROR_MESSAGE ); - e.printStackTrace(); - } - return null; - } - - /** - * Interactively creates a new project from a BDV/XML file. - *

    - * If the specified BDV file cannot be loaded a dialog shows up telling the - * user about the problem, and offering to start Mastodon on substituted - * dummy image data. - * - * @param context - * the current context. - * @param parentComponent - * a component to use as parent to show dialogs during opening. - * Can be null. - * @return a new {@link ProjectModel}. - * @throws SpimDataException - * if the BDV file that cannot be opened, and the user declined - * to substitute a dummy dataset. - */ - public static ProjectModel createProjectFromBdvFileWithDialog( final File file, final Context context, final Component parentComponent ) throws SpimDataException - { - final MamutProject project = MamutProjectIO.fromBdvFile( file ); - try - { - return ProjectLoader.openWithDialog( project, context, parentComponent ); - } - catch ( final IOException e ) - { - // Should not happen because the data model and the GUI state are empty. - e.printStackTrace(); - } - return null; - } - /** * Creates a new project from a BDV/XML file. * @@ -147,10 +71,13 @@ public static ProjectModel createProjectFromBdvFile( final File file, final Cont * @param parentComponent * a component to use as parent to show dialogs during opening. * Can be null. + * @param errorConsumer + * a consumer that will receive an user-readable error message if + * something wrong happens. * @return a new {@link ProjectModel} or null if the user * clicked cancel, or if the image data cannot be accessed. */ - public static synchronized ProjectModel createProjectFromUrl( final Context context, final Component parentComponent ) + public static synchronized ProjectModel createProjectFromUrl( final Context context, final Component parentComponent, final Consumer< String > errorConsumer ) { final String urlString = JOptionPane.showInputDialog( parentComponent, "Please input a url for image data" ); if ( urlString == null ) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectImporter.java b/src/main/java/org/mastodon/mamut/io/ProjectImporter.java index 8030b8347..1245bf29e 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectImporter.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectImporter.java @@ -6,20 +6,18 @@ import java.awt.Frame; import java.io.File; import java.io.IOException; - -import javax.swing.JOptionPane; +import java.util.function.Consumer; import org.mastodon.feature.FeatureSpecsService; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.importer.simi.SimiImportDialog; import org.mastodon.mamut.io.importer.tgmm.TgmmImportDialog; import org.mastodon.mamut.io.importer.trackmate.TrackMateImporter; +import org.mastodon.mamut.launcher.LauncherUtil; import org.mastodon.ui.util.FileChooser; import org.mastodon.ui.util.XmlFileFilter; import org.scijava.Context; -import mpicbg.spim.data.SpimDataException; - /** * Static methods for creating projects from other file formats. */ @@ -34,10 +32,13 @@ public class ProjectImporter * a component used as parent for dialogs. * @param context * the current context. - * @return the loaded {@link ProjectModel}, or null if the - * user cancels loading or if there is a problem reading the data. + * @param errorConsumer + * a consumer that will receive an user-readable error message if + * something wrong happens. + * @return the loaded {@link ProjectModel}, or null if the user + * cancels loading or if there is a problem reading the data. */ - public static synchronized ProjectModel openMamutWithDialog( final Component parentComponent, final Context context ) + public static synchronized ProjectModel openMamutWithDialog( final Component parentComponent, final Context context, final Consumer< String > errorConsumer ) { final File file = FileChooser.chooseFile( parentComponent, @@ -52,19 +53,14 @@ public static synchronized ProjectModel openMamutWithDialog( final Component par try { final TrackMateImporter importer = new TrackMateImporter( file ); - final ProjectModel appModel = ProjectLoader.openWithDialog( importer.createProject(), context, parentComponent ); + final ProjectModel appModel = LauncherUtil.openWithDialog( importer.createProject(), context, parentComponent, errorConsumer ); final FeatureSpecsService featureSpecsService = context.getService( FeatureSpecsService.class ); importer.readModel( appModel.getModel(), featureSpecsService ); return appModel; } - catch ( IOException | SpimDataException e ) + catch ( final IOException e ) { - JOptionPane.showMessageDialog( - parentComponent, - "Problem reading MaMuT file:\n" + e.getMessage(), - "Error reading MaMuT file", - JOptionPane.ERROR_MESSAGE ); - e.printStackTrace(); + errorConsumer.accept( "Problem reading MaMuT file:\n" + e.getMessage() ); } return null; } diff --git a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java index 88adec294..1a660a47f 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java @@ -1,18 +1,12 @@ package org.mastodon.mamut.io; -import static org.mastodon.app.MastodonIcons.LOAD_ICON_MEDIUM; - -import java.awt.Component; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import java.net.UnknownHostException; import java.nio.file.Files; import java.nio.file.StandardCopyOption; -import javax.swing.JOptionPane; - import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; @@ -27,9 +21,6 @@ import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; -import org.mastodon.ui.util.ExtensionFileFilter; -import org.mastodon.ui.util.FileChooser; -import org.mastodon.ui.util.FileChooser.SelectionMode; import org.mastodon.util.DummySpimData; import org.mastodon.views.bdv.SharedBigDataViewerData; import org.scijava.Context; @@ -37,8 +28,6 @@ import ij.IJ; import ij.ImagePlus; import mpicbg.spim.data.SpimDataException; -import mpicbg.spim.data.SpimDataIOException; -import mpicbg.spim.data.XmlKeys; /** * Static methods to open a Mastodon Mamut project. @@ -50,10 +39,6 @@ public class ProjectLoader static final String WINDOWS_TAG = "Windows"; - private static File proposedProjectRoot; - - private static MamutProject project; - /** * Opens a project. The GUI state is not restored. * @@ -163,201 +148,6 @@ public static ProjectModel open( final MamutProject project, final Context conte return appModel; } - /** - * Opens a project interactively, prompting the user for the project file. - *

    - * If the image data cannot be loaded a dialog shows up telling the user - * about the problem, and offering to start Mastodon on substituted dummy - * image data. If the user declines, a {@link SpimDataException} is thrown. - *

    - * The GUI state is restored. - * - * @param context - * the current context. - * @param parentComponent - * a component to use as parent to show dialogs during opening. - * Can be null. - * @return the loaded {@link ProjectModel}. - * @throws IOException - * if the project points to a regular image file for image data, - * and that file cannot be opened properly, or if there is a - * problem loading the model data, or if there is a problem - * reading the GUI state. - * @throws SpimDataException - * if the project points to a BDV file that cannot be opened, - * and the user declined to substitute a dummy dataset. - */ - public static final ProjectModel openWithDialog( final Context context, final Component parentComponent ) - { - String fn = null; - if ( proposedProjectRoot != null ) - fn = proposedProjectRoot.getAbsolutePath(); - else if ( project != null && project.getProjectRoot() != null ) - fn = project.getProjectRoot().getAbsolutePath(); - final File file = FileChooser.chooseFile( - true, - parentComponent, - fn, - new ExtensionFileFilter( "mastodon" ), - "Open Mastodon Project", - FileChooser.DialogType.LOAD, - SelectionMode.FILES_AND_DIRECTORIES, - LOAD_ICON_MEDIUM.getImage() ); - if ( file == null ) - return null; - - try - { - proposedProjectRoot = file; - final MamutProject project = MamutProjectIO.load( file.getAbsolutePath() ); - return openWithDialog( project, context, parentComponent ); - } - catch ( final IOException | SpimDataException e ) - { - JOptionPane.showMessageDialog( - parentComponent, - "Problem reading Mastodon file:\n" + e.getMessage(), - "Error reading Mastodon file", - JOptionPane.ERROR_MESSAGE ); - } - return null; - } - - /** - * Opens a project interactively from a specified Mastodon file. - *

    - * If the image data cannot be loaded a dialog shows up telling the user - * about the problem, and offering to start Mastodon on substituted dummy - * image data. If the user declines, a {@link SpimDataException} is thrown. - *

    - * The GUI state is restored. - * - * @param mastodonFile - * path to a Mastodon file - * @param context - * the current context. - * - * @return the loaded {@link ProjectModel}. - * @throws IOException - * if the project points to a regular image file for image data, - * and that file cannot be opened properly, or if there is a - * problem loading the model data, or if there is a problem - * reading the GUI state. - * @throws SpimDataException - * if the project points to a BDV file that cannot be opened, - * and the user declined to substitute a dummy dataset. - */ - public static synchronized ProjectModel openWithDialog( final String mastodonFile, final Context context ) throws IOException, SpimDataException - { - final MamutProject project = MamutProjectIO.load( mastodonFile ); - return openWithDialog( project, context ); - } - - - /** - * Opens a project interactively from a specified project object. - *

    - * If the image data cannot be loaded a dialog shows up telling the user - * about the problem, and offering to start Mastodon on substituted dummy - * image data. If the user declines, a {@link SpimDataException} is thrown. - *

    - * The GUI state is restored. - * - * @param project - * the object describing the project on disk. - * @param context - * the current context. - * - * @return the loaded {@link ProjectModel}. - * @throws IOException - * if the project points to a regular image file for image data, - * and that file cannot be opened properly, or if there is a - * problem loading the model data, or if there is a problem - * reading the GUI state. - * @throws SpimDataException - * if the project points to a BDV file that cannot be opened, - * and the user declined to substitute a dummy dataset. - */ - public static synchronized ProjectModel openWithDialog( final MamutProject project, final Context context ) throws IOException, SpimDataException - { - return openWithDialog( project, context, null ); - } - - /** - * Opens a project interactively from a Mastodon file. - *

    - * If the image data cannot be loaded a dialog shows up telling the user - * about the problem, and offering to start Mastodon on substituted dummy - * image data. - *

    - * The GUI state is restored. - * - * @param mastodonFile - * path to a Mastodon file - * @param context - * the current context. - * @param parentComponent - * a component to use as parent to show dialogs during opening. - * Can be null. - * @throws IOException - * if the project points to a regular image file for image data, - * and that file cannot be opened properly and the user declined - * to substitute dummy data; or if there is a problem loading - * the model data; or if there is a problem reading the GUI - * state. - * @throws SpimDataException - * if the project points to a BDV file that cannot be opened, - * and the user declined to substitute a dummy dataset. - * @return the loaded {@link ProjectModel}. - */ - public static synchronized ProjectModel openWithDialog( final String mastodonFile, final Context context, final Component parentComponent ) throws IOException, SpimDataException - { - final MamutProject project = MamutProjectIO.load( mastodonFile ); - return openWithDialog( project, context, parentComponent ); - } - - /** - * Opens a project interactively from a project object. - *

    - * If the image data cannot be loaded a dialog shows up telling the user - * about the problem, and offering to start Mastodon on substituted dummy - * image data. - *

    - * The GUI state is restored. - * - * @param project - * the object describing the project on disk. - * @param context - * the current context. - * @param parentComponent - * a component to use as parent to show dialogs during opening. - * Can be null. - * @throws IOException - * if the project points to a regular image file for image data, - * and that file cannot be opened properly and the user declined - * to substitute dummy data; or if there is a problem loading - * the model data; or if there is a problem reading the GUI - * state. - * @throws SpimDataException - * if the project points to a BDV file that cannot be opened, - * and the user declined to substitute a dummy dataset. - * @return the loaded {@link ProjectModel}. - */ - public static synchronized ProjectModel openWithDialog( final MamutProject project, final Context context, final Component parentComponent ) throws IOException, SpimDataException - { - try - { - return open( project, context, true, false ); - } - catch ( final SpimDataIOException | UnknownHostException e ) - { - if ( getUserPermissionToOpenDummyData( project, e, parentComponent ) ) - return open( project, context, true, true ); - - throw e; - } - } - /** * Loads the image data stored in a project, and wraps in a * {@link SharedBigDataViewerData}. @@ -506,63 +296,6 @@ public static final void loadGUI( final MamutProject project, final WindowManage } } - /** - * Shows an dialog the explains to the user why the image data could not - * been loaded, and offers to open Mastodon with dummy image data. - */ - private static boolean getUserPermissionToOpenDummyData( final MamutProject project, final Exception e, final Component parentComponent ) - { - final String problemDescription = getProblemDescription( project, e ); - System.err.println( problemDescription ); - final String title = "Problem Opening Mastodon Project"; - String message = ""; - message += "Mastodon could not find the images associated with this project.\n"; - message += "\n"; - message += problemDescription + "\n"; - message += "\n"; - message += "It is still possible to open the project.\n"; - message += "You can inspect and modify the tracking data.\n"; - message += "But you won't be able to see the image data.\n"; - message += "\n"; - message += "You may fix this problem by correcting the image path in the Mastodon project.\n"; - message += "In the Mastodon menu select: File -> Fix Image Path.\n"; - message += "\n"; - message += "How would you like to continue?"; - final String[] options = { "Open With Dummy Images", "Cancel" }; - final int dialogResult = JOptionPane.showOptionDialog( parentComponent, message, title, JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE, null, options, null ); - return dialogResult == JOptionPane.YES_OPTION; - } - - private static String getProblemDescription( final MamutProject project, final Exception e ) - { - final File datasetXml = project.getDatasetXmlFile(); - if ( !datasetXml.exists() ) - return "The image data XML was not found:\n" + datasetXml; - final Throwable cause = e.getCause(); - if ( cause instanceof UnknownHostException ) - return errorMessageUnknownHost( datasetXml, cause.getMessage() ); - return e.getMessage(); - } - - private static String errorMessageUnknownHost( final File datasetXml, final String host ) - { - final SAXBuilder sax = new SAXBuilder(); - try - { - final Document doc = sax.build( datasetXml ); - final Element root = doc.getRootElement(); - final String baseUrl = root - .getChild( XmlKeys.SEQUENCEDESCRIPTION_TAG ) - .getChild( XmlKeys.IMGLOADER_TAG ) - .getChildText( "baseUrl" ); - return "Cannot reach host " + host + " for the dataset URL: " + baseUrl; - } - catch ( final Exception e ) - { - return "Unparsable dataset file: " + e.getMessage(); - } - } private static SharedBigDataViewerData openDummyImageData( final MamutProject project ) { diff --git a/src/main/java/org/mastodon/mamut/launcher/LauncherGUI.java b/src/main/java/org/mastodon/mamut/launcher/LauncherGUI.java index 44a9b15e6..dc02fba30 100644 --- a/src/main/java/org/mastodon/mamut/launcher/LauncherGUI.java +++ b/src/main/java/org/mastodon/mamut/launcher/LauncherGUI.java @@ -57,7 +57,6 @@ import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.JTextPane; -import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; @@ -350,36 +349,36 @@ public void error( final String message ) log( message, ERROR_COLOR ); } + public void log( final String string ) + { + log( string, NORMAL_COLOR ); + } public void log( final String message, final Color color ) { - SwingUtilities.invokeLater( new Runnable() + final StyleContext sc = StyleContext.getDefaultStyleContext(); + final AttributeSet aset = sc.addAttribute( SimpleAttributeSet.EMPTY, StyleConstants.Foreground, color ); + final AbstractDocument doc = ( AbstractDocument ) logger.textPane.getStyledDocument(); + final int len = doc.getLength(); + final int l = message.length(); + + logger.textPane.setEditable( true ); + if ( len + l > MAX_N_CHARS ) { - @Override - public void run() + final int delta = Math.max( 0, Math.min( l - 1, len + l - MAX_N_CHARS ) ); + try { - final StyleContext sc = StyleContext.getDefaultStyleContext(); - final AttributeSet aset = sc.addAttribute( SimpleAttributeSet.EMPTY, StyleConstants.Foreground, color ); - final AbstractDocument doc = ( AbstractDocument ) logger.textPane.getStyledDocument(); - final int len = doc.getLength(); - final int l = message.length(); - - if ( len + l > MAX_N_CHARS ) - { - final int delta = Math.max( 0, Math.min( l - 1, len + l - MAX_N_CHARS ) ); - try - { - doc.remove( 0, delta ); - } - catch ( final BadLocationException e ) - { - e.printStackTrace(); - } - } - logger.textPane.setCaretPosition( doc.getLength() ); - logger.textPane.setCharacterAttributes( aset, false ); - logger.textPane.replaceSelection( message ); + doc.remove( 0, delta ); + } + catch ( final BadLocationException e ) + { + e.printStackTrace(); } - } ); + } + logger.textPane.setCaretPosition( doc.getLength() ); + logger.textPane.setCharacterAttributes( aset, false ); + logger.textPane.replaceSelection( message ); + logger.textPane.setEditable( false ); + showPanel( LOGGER_KEY ); } public void setStatus( final String status ) @@ -389,14 +388,9 @@ public void setStatus( final String status ) public void setLog( final String string ) { - SwingUtilities.invokeLater( new Runnable() - { - @Override - public void run() - { - logger.textPane.setText( string ); - } - } ); + logger.textPane.setEditable( true ); + logger.textPane.setText( string ); + logger.textPane.setEditable( false ); } public void clearLog() diff --git a/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java b/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java index 2f2fd1bd3..6b11dfb3c 100644 --- a/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java +++ b/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java @@ -28,14 +28,21 @@ */ package org.mastodon.mamut.launcher; +import static org.mastodon.app.MastodonIcons.LOAD_ICON_MEDIUM; +import static org.mastodon.app.MastodonIcons.NEW_ICON_MEDIUM; + import java.awt.BorderLayout; import java.awt.Component; import java.awt.Desktop; import java.awt.Dimension; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; +import java.net.NoRouteToHostException; import java.net.URISyntaxException; import java.net.URL; +import java.net.UnknownHostException; +import java.util.function.Consumer; import javax.swing.ActionMap; import javax.swing.BorderFactory; @@ -44,26 +51,413 @@ import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JLabel; +import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.KeyStroke; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.input.SAXBuilder; import org.mastodon.app.MastodonIcons; +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.io.ProjectLoader; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.ui.util.EverythingDisablerAndReenabler; +import org.mastodon.ui.util.ExtensionFileFilter; import org.mastodon.ui.util.FileChooser; +import org.mastodon.ui.util.FileChooser.SelectionMode; import org.mastodon.ui.util.XmlFileFilter; +import org.scijava.Context; import org.scijava.ui.behaviour.util.RunnableAction; +import ch.systemsx.cisd.hdf5.exceptions.HDF5FileNotFoundException; +import mpicbg.spim.data.SpimDataException; +import mpicbg.spim.data.XmlKeys; import mpicbg.spim.data.generic.AbstractSpimData; import mpicbg.spim.data.generic.sequence.BasicViewSetup; import mpicbg.spim.data.sequence.VoxelDimensions; import net.imglib2.Dimensions; -class LauncherUtil +public class LauncherUtil { + private static File proposedProjectRoot; + + private static MamutProject project; + + /** + * Interactively creates a new project prompting the user for a path to a + * BDV/XML file. + *

    + * A dialog is shown to prompt the user for the path to the XML file. If the + * image data cannot be loaded a dialog shows up telling the user about the + * problem, and offering to start Mastodon on substituted dummy image data. + * + * @param context + * the current context. + * @param parentComponent + * a component to use as parent to show dialogs during opening. + * Can be null. + * @param errorConsumer + * a consumer that will receive an user-readable error message if + * something wrong happens. + * @return a new {@link ProjectModel} or null if the user + * clicked cancel, or if the BDV file is faulty and the user + * declined to substitute a dummy dataset. + */ + public static synchronized ProjectModel createProjectWithDialog( final Context context, final Component parentComponent, final Consumer< String > errorConsumer ) + { + final File file = FileChooser.chooseFile( + parentComponent, + null, + new XmlFileFilter(), + "Open BigDataViewer File", + FileChooser.DialogType.LOAD, + NEW_ICON_MEDIUM.getImage() ); + if ( file == null ) + return null; + + return createProjectFromBdvFileWithDialog( file, context, parentComponent, errorConsumer ); + } + + /** + * Interactively creates a new project from a BDV/XML file. + *

    + * If the specified BDV file cannot be loaded a dialog shows up telling the + * user about the problem, and offering to start Mastodon on substituted + * dummy image data. + * + * @param context + * the current context. + * @param parentComponent + * a component to use as parent to show dialogs during opening. + * Can be null. + * @param errorConsumer + * a consumer that will receive an user-readable error message if + * something wrong happens. + * @return a new {@link ProjectModel}. + */ + public static ProjectModel createProjectFromBdvFileWithDialog( final File file, final Context context, final Component parentComponent, final Consumer< String > errorConsumer ) + { + final MamutProject project = MamutProjectIO.fromBdvFile( file ); + return openWithDialog( project, context, parentComponent, errorConsumer ); + } + + /** + * Opens a project interactively, prompting the user for the project file. + *

    + * If the image data cannot be loaded a dialog shows up telling the user + * about the problem, and offering to start Mastodon on substituted dummy + * image data. + *

    + * The GUI state is restored. + * + * @param context + * the current context. + * @param parentComponent + * a component to use as parent to show dialogs during opening. + * Can be null. + * @param errorConsumer + * a consumer that will receive an user-readable error message if + * something wrong happens. + * @return the loaded {@link ProjectModel}, or null if the + * image cannot be loaded and the user declined to substitute a + * dummy dataset. + * @throws IOException + * if the project points to a regular image file for image data, + * and that file cannot be opened properly, or if there is a + * problem loading the model data, or if there is a problem + * reading the GUI state. + */ + public static final ProjectModel openWithDialog( final Context context, final Component parentComponent, final Consumer< String > errorConsumer ) + { + String fn = null; + if ( proposedProjectRoot != null ) + fn = proposedProjectRoot.getAbsolutePath(); + else if ( project != null && project.getProjectRoot() != null ) + fn = project.getProjectRoot().getAbsolutePath(); + final File file = FileChooser.chooseFile( + true, + parentComponent, + fn, + new ExtensionFileFilter( "mastodon" ), + "Open Mastodon Project", + FileChooser.DialogType.LOAD, + SelectionMode.FILES_AND_DIRECTORIES, + LOAD_ICON_MEDIUM.getImage() ); + if ( file == null ) + { + errorConsumer.accept( "User canceled opening project." ); + return null; + } + + proposedProjectRoot = file; + MamutProject project = null; + try + { + project = MamutProjectIO.load( file.getAbsolutePath() ); + } + catch ( final IOException e ) + { + errorConsumer.accept( "Problem opening project file " + file.getAbsolutePath() + ":" + e.getMessage() ); + return null; + } + return openWithDialog( project, context, parentComponent, errorConsumer ); + } + + /** + * Opens a project interactively from a specified Mastodon file. + *

    + * If the image data cannot be loaded a dialog shows up telling the user + * about the problem, and offering to start Mastodon on substituted dummy + * image data. If the user declines, a {@link SpimDataException} is thrown. + *

    + * The GUI state is restored. + * + * @param mastodonFile + * path to a Mastodon file + * @param context + * the current context. + * @param errorConsumer + * a consumer that will receive an user-readable error message if + * something wrong happens. + * @return the loaded {@link ProjectModel}. + * + */ + public static synchronized ProjectModel openWithDialog( final String mastodonFile, final Context context, final Consumer< String > errorConsumer ) throws IOException, SpimDataException + { + final MamutProject project = MamutProjectIO.load( mastodonFile ); + return openWithDialog( project, context, errorConsumer ); + } + + /** + * Opens a project interactively from a specified project object. + *

    + * If the image data cannot be loaded a dialog shows up telling the user + * about the problem, and offering to start Mastodon on substituted dummy + * image data. If the user declines, a {@link SpimDataException} is thrown. + *

    + * The GUI state is restored. + * + * @param project + * the object describing the project on disk. + * @param context + * the current context. + * @param errorConsumer + * a consumer that will receive an user-readable error message if + * something wrong happens. + * + * @return the loaded {@link ProjectModel}, or null if the + * image cannot be loaded and the user declined to substitute a + * dummy dataset. + * @param errorConsumer + * a consumer that will receive an user-readable error message if + * something wrong happens. + */ + public static synchronized ProjectModel openWithDialog( final MamutProject project, final Context context, final Consumer< String > errorConsumer ) throws IOException, SpimDataException + { + return openWithDialog( project, context, null, errorConsumer ); + } + + /** + * Opens a project interactively from a Mastodon file. + *

    + * If the image data cannot be loaded a dialog shows up telling the user + * about the problem, and offering to start Mastodon on substituted dummy + * image data. + *

    + * The GUI state is restored. + * + * @param mastodonFile + * path to a Mastodon file + * @param context + * the current context. + * @param parentComponent + * a component to use as parent to show dialogs during opening. + * Can be null. + * @param errorConsumer + * a consumer that will receive an user-readable error message if + * something wrong happens. + * @return the loaded {@link ProjectModel}. + */ + public static synchronized ProjectModel openWithDialog( final String mastodonFile, final Context context, final Component parentComponent, final Consumer< String > errorConsumer ) + { + MamutProject project = null; + try + { + project = MamutProjectIO.load( mastodonFile ); + } + catch ( final IOException e ) + { + final String errorMessage = "Unable to open project file " + mastodonFile + ":\n" + e.getMessage(); + errorConsumer.accept( errorMessage ); + return null; + } + return openWithDialog( project, context, parentComponent, errorConsumer ); + } + + /** + * Opens a project interactively from a project object. + *

    + * If the image data cannot be loaded a dialog shows up telling the user + * about the problem, and offering to start Mastodon on substituted dummy + * image data. + *

    + * The GUI state is restored. + * + * @param project + * the object describing the project on disk. + * @param context + * the current context. + * @param parentComponent + * a component to use as parent to show dialogs during opening. + * Can be null. + * @param errorConsumer + * a consumer that will receive an user-readable error message if + * something wrong happens. + * @return the loaded {@link ProjectModel}, or null if the + * image cannot be loaded and the user declined to substitute a + * dummy dataset. + */ + public static synchronized ProjectModel openWithDialog( final MamutProject project, final Context context, final Component parentComponent, final Consumer< String > errorConsumer ) + { + try + { + return ProjectLoader.open( project, context, true, false ); + } + catch ( final SpimDataException | IOException | RuntimeException e ) + { + if ( getUserPermissionToOpenDummyData( project, e, parentComponent ) ) + { + try + { + return ProjectLoader.open( project, context, true, true ); + } + catch ( final Exception e1 ) + { + final String errorMsg = getProblemDescription( project, e1 ); + errorConsumer.accept( errorMsg ); + } + } + else + { + final String errorMsg = getProblemDescription( project, e ); + errorConsumer.accept( errorMsg ); + } + return null; + } + } + + /** + * Shows an dialog the explains to the user why the image data could not + * been loaded, and offers to open Mastodon with dummy image data. + */ + private static boolean getUserPermissionToOpenDummyData( final MamutProject project, final Exception e, final Component parentComponent ) + { + final String problemDescription = getProblemDescription( project, e ); + System.err.println( problemDescription ); + final String title = "Problem Opening Mastodon Project"; + String message = ""; + message += "Mastodon could not find the images associated with this project.\n"; + message += "\n"; + message += problemDescription + "\n"; + message += "\n"; + message += "It is still possible to open the project.\n"; + message += "You can inspect and modify the tracking data.\n"; + message += "But you won't be able to see the image data.\n"; + message += "\n"; + message += "You may fix this problem by correcting the image path in the Mastodon project.\n"; + message += "In the Mastodon menu select: File -> Fix Image Path.\n"; + message += "\n"; + message += "How would you like to continue?"; + final String[] options = { "Open With Dummy Images", "Cancel" }; + final int dialogResult = JOptionPane.showOptionDialog( parentComponent, message, title, JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE, null, options, null ); + return dialogResult == JOptionPane.YES_OPTION; + } + + /** + * To be used when opening a Mastodon file. Generates a user-readable + * error message from the specified exception that was triggered when + * loading the specified project. + * + * @param project + * the project. + * @param e + * the exception. + * @return an error message. + */ + public static String getProblemDescription( final MamutProject project, final Exception e ) + { + File datasetXml = new File( "" ); + if ( project != null ) + { + datasetXml = project.getDatasetXmlFile(); + if ( !datasetXml.exists() ) + return "The BDV image XML file was not found:\n" + datasetXml; + } + + if ( FileNotFoundException.class.isInstance( e.getCause() ) ) + { + /* + * Local or remote XML file not found (happens with remote opening + * when the server is down). + */ + return "Could not find the image data file:\n" + e.getCause().getMessage(); + } + else if ( HDF5FileNotFoundException.class.isInstance( e ) ) + { + /* + * Local file but the H5 file cannot be found. + */ + return "Error in the BDV XML file:" + datasetXml + + "\nCould not find the HDF5 image data file:\n" + + e.getMessage(); + } + else if ( UnknownHostException.class.isInstance( e.getCause() ) ) + { + /* + * Trying to create a new project with a remove server that unknown. + */ + return "Unknown host " + errorMessageUnknownHost( datasetXml, e.getCause().getMessage() ); + } + else if ( NoRouteToHostException.class.isInstance( e.getCause() ) ) + { + /* + * Trying to load or create a project with a remote image data + * stored on a server that we cannot access to now (my computer has + * no internet). + */ + return "Cannot access remote host " + errorMessageUnknownHost( datasetXml, e.getCause().getMessage() ); + } + + // Everything else. + return e.getMessage(); + } + + private static String errorMessageUnknownHost( final File datasetXml, final String hostError ) + { + final SAXBuilder sax = new SAXBuilder(); + try + { + final Document doc = sax.build( datasetXml ); + final Element root = doc.getRootElement(); + final String baseUrl = root + .getChild( XmlKeys.SEQUENCEDESCRIPTION_TAG ) + .getChild( XmlKeys.IMGLOADER_TAG ) + .getChildText( "baseUrl" ); + return baseUrl + "\n" + hostError; + } + catch ( final Exception e ) + { + return "and unparsable dataset file: " + e.getMessage(); + } + } + static final void showHelp( final URL helpURL, final String title, final Component parent ) { @@ -96,7 +490,7 @@ public void hyperlinkUpdate( final HyperlinkEvent e ) } catch ( - final IOException e ) + final IOException e ) { editorPane.setText( "Attempted to read a bad URL: " + helpURL ); } @@ -203,9 +597,4 @@ static final String buildInfoString( final AbstractSpimData< ? > spimData ) str.append( "" ); return str.toString(); } - - static final String toMessage( final Exception e ) - { - return e.getMessage(); - } } diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java index 414f2b824..18f67cc55 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonDndLauncher.java @@ -33,7 +33,6 @@ import org.mastodon.mamut.MainWindow; import org.mastodon.mamut.ProjectModel; -import org.mastodon.mamut.io.ProjectLoader; import org.scijava.io.AbstractIOPlugin; import org.scijava.io.IOPlugin; import org.scijava.io.location.FileLocation; @@ -76,7 +75,7 @@ public Object open( final Location source ) throws IOException try { - final ProjectModel appModel = ProjectLoader.openWithDialog( projectPath, getContext(), null ); + final ProjectModel appModel = LauncherUtil.openWithDialog( projectPath, getContext(), null ); final MainWindow mainWindow = new MainWindow( appModel ); mainWindow.setVisible( true ); } diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java index 94a332827..b7e4d8b6d 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java @@ -48,7 +48,6 @@ import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; -import javax.swing.SwingUtilities; import org.jdom2.JDOMException; import org.mastodon.app.MastodonIcons; @@ -62,6 +61,7 @@ import org.mastodon.mamut.io.importer.tgmm.TgmmImporter; import org.mastodon.mamut.io.importer.trackmate.TrackMateImporter; import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; import org.mastodon.mamut.model.Model; import org.mastodon.ui.util.EverythingDisablerAndReenabler; import org.mastodon.ui.util.ExtensionFileFilter; @@ -128,6 +128,7 @@ public MastodonLauncher( final Context context ) private void importSimi() { + gui.clearLog(); if ( !gui.importSimiBioCellPanel.checkBDVFile() ) return; @@ -140,7 +141,7 @@ private void importSimi() { // Create new blank project from BDV file. final File bdvFile = new File( gui.importSimiBioCellPanel.textAreaBDVFile.getText() ); - final ProjectModel appModel = ProjectCreator.createProjectFromBdvFileWithDialog( bdvFile, context, gui ); + final ProjectModel appModel = LauncherUtil.createProjectFromBdvFileWithDialog( bdvFile, context, gui, gui::error ); final Model model = appModel.getModel(); final AbstractSpimData< ? > spimData = appModel.getSharedBdvData().getSpimData(); @@ -204,18 +205,13 @@ else if ( tp > maxtp ) { gui.importSimiBioCellPanel.labelInfo.setText( "Problem reading the SimiBioCell file.

    " + - LauncherUtil.toMessage( e ) + "" ); + e.getMessage() + "" ); } catch ( final ParseException e ) { gui.importSimiBioCellPanel.labelInfo.setText( "Problem parsing the SimiBioCell file.

    " + - LauncherUtil.toMessage( e ) + "" ); - } - catch ( final SpimDataException e ) - { - gui.importSimiBioCellPanel.labelInfo.setText( "Invalid BDV xml/h5 file.

    " + - LauncherUtil.toMessage( e ) + "" ); + e.getMessage() + "" ); } finally { @@ -226,6 +222,7 @@ else if ( tp > maxtp ) private void importTgmm() { + gui.clearLog(); if ( !gui.importTGMMPanel.checkBDVFile( false ) || !gui.importTGMMPanel.checkTGMMFolder() ) return; @@ -243,7 +240,7 @@ private void importTgmm() // Create new blank project from BDV file. final File bdvFile = new File( gui.importTGMMPanel.textAreaBDVFile.getText() ); - final ProjectModel appModel = ProjectCreator.createProjectFromBdvFileWithDialog( bdvFile, context, gui ); + final ProjectModel appModel = LauncherUtil.createProjectFromBdvFileWithDialog( bdvFile, context, gui, gui::error ); final Model model = appModel.getModel(); final AbstractSpimData< ? > spimData = appModel.getSharedBdvData().getSpimData(); @@ -280,17 +277,12 @@ private void importTgmm() catch ( final ParseException e ) { gui.importTGMMPanel.labelInfo.setText( "Could not parse timepoint pattern.

    " + - LauncherUtil.toMessage( e ) + "" ); + e.getMessage() + "" ); } catch ( JDOMException | IOException e ) { gui.importTGMMPanel.labelInfo.setText( "Malformed TGMM dataset.

    " + - LauncherUtil.toMessage( e ) + "" ); - } - catch ( final SpimDataException e ) - { - gui.importTGMMPanel.labelInfo.setText( "Invalid BDV xml/h5 file.

    " + - LauncherUtil.toMessage( e ) + "" ); + e.getMessage() + "" ); } disabler.reenable(); } ).start(); @@ -332,6 +324,7 @@ else if ( entries.length == 9 ) private void createNewProject() { + gui.clearLog(); if ( gui.newMastodonProjectPanel.rdbtBrowseToBDV.isSelected() ) { /* @@ -348,15 +341,10 @@ private void createNewProject() new Thread( () -> { try { - final ProjectModel appModel = ProjectCreator.createProjectFromBdvFileWithDialog( file, context, gui ); + final ProjectModel appModel = LauncherUtil.createProjectFromBdvFileWithDialog( file, context, gui, gui::error ); new MainWindow( appModel ).setVisible( true ); dispose(); } - catch ( final SpimDataException e ) - { - gui.newMastodonProjectPanel.labelInfo.setText( "Invalid BDV xml/h5 file.

    " + - LauncherUtil.toMessage( e ) + "" ); - } finally { disabler.reenable(); @@ -450,7 +438,7 @@ public void windowClosing( final WindowEvent e ) catch ( final SpimDataException e ) { gui.newMastodonProjectPanel.labelInfo.setText( "Invalid image.

    " + - LauncherUtil.toMessage( e ) + "" ); + e.getMessage() + "" ); } finally { @@ -492,6 +480,7 @@ private void showHelpPanel() private void createProjectFromURL() { + gui.clearLog(); final String filepath = gui.openRemoteURLPanel.taFileSave.getText(); if ( filepath == null || filepath.isEmpty() ) { @@ -537,13 +526,13 @@ private void createProjectFromURL() { gui.openRemoteURLPanel.log.setForeground( Color.RED ); gui.openRemoteURLPanel.log.setText( "Problem save to BDV file.

    " + - LauncherUtil.toMessage( e ) + "" ); + e.getMessage() + "" ); } /* * Open it as a new Mastodon project. */ - final ProjectModel appModel = ProjectCreator.createProjectFromBdvFileWithDialog( file, context, gui ); + final ProjectModel appModel = LauncherUtil.createProjectFromBdvFileWithDialog( file, context, gui, gui::error ); new MainWindow( appModel ).setVisible( true ); /* @@ -554,12 +543,6 @@ private void createProjectFromURL() dispose(); } - catch ( final SpimDataException e ) - { - gui.openRemoteURLPanel.log.setForeground( Color.RED ); - gui.openRemoteURLPanel.log.setText( "Problem creating project.

    " + - LauncherUtil.toMessage( e ) + "" ); - } finally { disabler.reenable(); @@ -586,11 +569,11 @@ private void importMaMuT() gui.showPanel( LauncherGUI.LOGGER_KEY ); new Thread( () -> { + MamutProject project = null; try { - final TrackMateImporter importer = new TrackMateImporter( file ); - final MamutProject project = importer.createProject(); + project = importer.createProject(); final ProjectModel appModel = ProjectLoader.open( project, context ); final FeatureSpecsService featureSpecsService = context.getService( FeatureSpecsService.class ); @@ -600,7 +583,7 @@ private void importMaMuT() } catch ( final IOException | SpimDataException e ) { - gui.error( "Invalid MaMuT file.\n\n" + LauncherUtil.toMessage( e ) ); + gui.error( "Invalid MaMuT file.\n\n" + LauncherUtil.getProblemDescription( project, e ) ); } finally { @@ -611,57 +594,57 @@ private void importMaMuT() private void loadMastodonProject( final String projectPath ) { - final EverythingDisablerAndReenabler disabler = - new EverythingDisablerAndReenabler( gui, new Class[] { JLabel.class } ); + final EverythingDisablerAndReenabler disabler = new EverythingDisablerAndReenabler( gui, new Class[] { JLabel.class } ); disabler.disable(); + gui.clearLog(); gui.showPanel( LauncherGUI.LOGGER_KEY ); + final File file; + if ( projectPath == null ) + { + // Use the the most recent opened location as initial + // location for the file chooser + final Iterator< String > iterator = RecentProjectsPanel.recentProjects.iterator(); + final String previousPath = iterator.hasNext() ? iterator.next() : null; + // We have to use the JFileChooser to open folders. + file = FileChooser.chooseFile( + true, + this, + previousPath, + new ExtensionFileFilter( "mastodon" ), + "Open Mastodon Project", + FileChooser.DialogType.LOAD, + SelectionMode.FILES_AND_DIRECTORIES ); + if ( file == null ) + return; + } + else + { + file = new File( projectPath ); + } + gui.log( "Opening Mastodon project file " + file + "\n" ); + new Thread( () -> { try { - gui.clearLog(); - SwingUtilities.invokeLater( () -> { - - final File file; - if ( projectPath == null ) - { - // Use the the most recent opened location as initial - // location for the file chooser - final Iterator iterator = RecentProjectsPanel.recentProjects.iterator(); - final String previousPath = iterator.hasNext() ? iterator.next() : null; - // We have to use the JFileChooser to open folders. - file = FileChooser.chooseFile( - true, - this, - previousPath, - new ExtensionFileFilter( "mastodon" ), - "Open Mastodon Project", - FileChooser.DialogType.LOAD, - SelectionMode.FILES_AND_DIRECTORIES ); - if ( file == null ) - return; - } - else - { - file = new File( projectPath ); - } - - try - { - final ProjectModel appModel = ProjectLoader.openWithDialog( file.getAbsolutePath(), context, this ); - new MainWindow( appModel ).setVisible( true ); - dispose(); - /* - * We update the list of recent projects here so that - * only projects that were successfully opened are added - * to the list. - */ - RecentProjectsPanel.recentProjects.add( file.getAbsolutePath() ); - } - catch ( final IOException | SpimDataException e ) - { - gui.error( "Invalid Mastodon file.\n\n" + LauncherUtil.toMessage( e ) ); - } - } ); + try + { + final MamutProject project = MamutProjectIO.load( file.getAbsolutePath() ); + final ProjectModel appModel = LauncherUtil.openWithDialog( project, context, this, gui::error ); + if ( appModel == null ) + return; + new MainWindow( appModel ).setVisible( true ); + dispose(); + /* + * We update the list of recent projects here so that only + * projects that were successfully opened are added to the + * list. + */ + RecentProjectsPanel.recentProjects.add( file.getAbsolutePath() ); + } + catch ( final IOException e ) + { + gui.error( "Invalid Mastodon file.\nMaybe it is not a Mastodon file?\n\n" + LauncherUtil.getProblemDescription( null, e ) ); + } } finally { @@ -681,8 +664,7 @@ public synchronized void drop( final DropTargetDropEvent dropTargetDropEvent ) { dropTargetDropEvent.acceptDrop( DnDConstants.ACTION_COPY ); @SuppressWarnings( "unchecked" ) - final - List< File > droppedFiles = ( List< File > ) dropTargetDropEvent.getTransferable().getTransferData( DataFlavor.javaFileListFlavor ); + final List< File > droppedFiles = ( List< File > ) dropTargetDropEvent.getTransferable().getTransferData( DataFlavor.javaFileListFlavor ); for ( final File file : droppedFiles ) { // process files diff --git a/src/main/java/org/mastodon/mamut/launcher/OpenRemoteURLPanel.java b/src/main/java/org/mastodon/mamut/launcher/OpenRemoteURLPanel.java index a7c6bf49b..8faab1ec6 100644 --- a/src/main/java/org/mastodon/mamut/launcher/OpenRemoteURLPanel.java +++ b/src/main/java/org/mastodon/mamut/launcher/OpenRemoteURLPanel.java @@ -193,7 +193,7 @@ private void parseURL( final String urlString ) catch ( final MalformedURLException e2 ) { log.setForeground( Color.RED.darker() ); - log.setText( "Malformed URL." + LauncherUtil.toMessage( e2 ) ); + log.setText( "Malformed URL." + e2.getMessage() ); return; } diff --git a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java index 9869dcf55..886c0131d 100644 --- a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java +++ b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java @@ -69,6 +69,7 @@ import bdv.viewer.ViewerOptions; import bdv.viewer.ViewerPanel; import bdv.viewer.ViewerState; +import ch.systemsx.cisd.hdf5.exceptions.HDF5FileNotFoundException; import ij.CompositeImage; import ij.IJ; import ij.ImagePlus; @@ -409,9 +410,14 @@ public static SharedBigDataViewerData fromSpimDataXmlFile( final String spimData catch ( final RuntimeException e ) { if ( FileNotFoundException.class.isInstance( e.getCause() ) ) - throw new SpimDataIOException( "Could not find the image data file:\n" + e.getMessage() ); + throw new SpimDataIOException( "Could not find the image data file:\n" + e.getCause().getMessage() ); + else if ( HDF5FileNotFoundException.class.isInstance( e ) ) + throw new SpimDataIOException( "Error in the BDV XML file:" + spimDataXmlFilename + + "\nCould not find the HDF5 image data file:\n" + + e.getMessage() ); + + throw ( e ); } - return null; } public static SharedBigDataViewerData fromDummyFilename( final String spimDataXmlFilename ) From ac491a13613c01b5bc9a7bb20a40eac174ab4f80 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 16:16:34 +0200 Subject: [PATCH 057/220] Determine physical units if missing when creating new projects. --- .../org/mastodon/mamut/io/ProjectLoader.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java index 1a660a47f..286865cc0 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java @@ -28,6 +28,7 @@ import ij.IJ; import ij.ImagePlus; import mpicbg.spim.data.SpimDataException; +import mpicbg.spim.data.generic.sequence.BasicViewSetup; /** * Static methods to open a Mastodon Mamut project. @@ -138,10 +139,32 @@ public static ProjectModel open( final String mastodonFile, final Context contex */ public static ProjectModel open( final MamutProject project, final Context context, final boolean restoreGUIState, final boolean authorizeSubstituteDummyData ) throws IOException, SpimDataException { + // Load image data. final SharedBigDataViewerData imageData = loadImageData( project, authorizeSubstituteDummyData ); + + // Try to read units from spimData is they are not present. + if ( project.getSpaceUnits() == null ) + { + project.setSpaceUnits( + imageData.getSpimData().getSequenceDescription().getViewSetupsOrdered().stream() + .filter( BasicViewSetup::hasVoxelSize ) + .map( setup -> setup.getVoxelSize().unit() ) + .findFirst() + .orElse( "pixel" ) ); + } + + if ( project.getTimeUnits() == null ) + { + project.setTimeUnits( "frame" ); + } + + // Load model. final Model model = loadModel( project, context ); + + // Build app model. final ProjectModel appModel = ProjectModel.create( context, model, imageData, project ); + // Restore GUI state. if ( restoreGUIState ) loadGUI( project, appModel.getWindowManager() ); From bbccb236c58aca3c159c88cf6b87a204da8c1d93 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 17:28:22 +0200 Subject: [PATCH 058/220] Ask for a file to save to if one was not set before. --- src/main/java/org/mastodon/mamut/io/ProjectSaver.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java index 056705368..950b9e7e7 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java @@ -188,6 +188,14 @@ public void run() */ public static void saveProject( final ProjectModel appModel, final Component parentComponent ) { + final MamutProject project = appModel.getProject(); + // If a Mastodon project was not yet created, ask to create one. + if ( project.getProjectRoot() == null ) + { + saveProjectAs( appModel, parentComponent ); + return; + } + try { saveProject( appModel.getProject().getProjectRoot(), appModel ); From 02e5672e0b2ad9297e68cf1c119c93fbe70dceca Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 17:28:43 +0200 Subject: [PATCH 059/220] When creating a view, returns null if the view type is unknown. --- src/main/java/org/mastodon/mamut/WindowManager.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 6567cdecc..6ccf44df3 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -240,6 +240,9 @@ public < T extends MamutViewI > T createView( final Class< T > klass ) /** * Creates, shows, registers and returns a view of the specified class, with * GUI state read from the specified map. + *

    + * Return null if the type of view is unknown to the window + * manager. * * @param * the view type. @@ -247,13 +250,18 @@ public < T extends MamutViewI > T createView( final Class< T > klass ) * the view class. * @param guiState * the GUI state map. - * @return a new instance of the view, that was shown. + * @return a new instance of the view, or null if the view + * class is unknown to the window manager. */ public synchronized < T extends MamutViewI > T createView( final Class< T > klass, final Map< String, Object > guiState ) { // Get the right factory. final MamutViewFactory< T > factory = mamutViews.getFactory( klass ); + // Return null if the view type is unknown to us. + if ( factory == null ) + return null; + // Create the view. final T view = factory.create( appModel ); From 94e780d128c755ba389953f61a720c77398a5632 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 17:54:40 +0200 Subject: [PATCH 060/220] Do not close the project if we failed to save it when converting to BDV. --- src/main/java/org/mastodon/mamut/io/ProjectSaver.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java index 950b9e7e7..61f643539 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java @@ -369,9 +369,6 @@ public void windowClosing( final java.awt.event.WindowEvent e ) final Model model = appModel.getModel(); final ProjectModel nmam = ProjectModel.create( context, model, sbdv, np ); - // Close the old one. - appModel.close(); - // Offer to save the new project. final File file = FileChooser.chooseFile( true, parentComponent, @@ -396,8 +393,12 @@ public void windowClosing( final java.awt.event.WindowEvent e ) "Error writing to file", JOptionPane.ERROR_MESSAGE ); e.printStackTrace(); + return; } + // Close the old one. + appModel.close(); + // Show the UI for the new one. new MainWindow( nmam ).setVisible( true ); } From 3d00ca6ba934ddb6695b9a4dddb132e0390f234c Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 17:54:54 +0200 Subject: [PATCH 061/220] Close the main window when a project is closed. --- src/main/java/org/mastodon/mamut/MainWindow.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/MainWindow.java b/src/main/java/org/mastodon/mamut/MainWindow.java index b0ad892a2..1b2b2f56d 100644 --- a/src/main/java/org/mastodon/mamut/MainWindow.java +++ b/src/main/java/org/mastodon/mamut/MainWindow.java @@ -204,6 +204,9 @@ public void windowClosing( final WindowEvent e ) pack(); setResizable( false ); + + // Register to when the project model is closed. + appModel.projectClosedListeners().add( () -> dispose() ); } /** @@ -220,7 +223,6 @@ public boolean close() if ( appModel.getModel().isSavePoint() ) { appModel.close(); - dispose(); return true; } @@ -252,7 +254,6 @@ public boolean close() case JOptionPane.NO_OPTION: appModel.close(); - dispose(); } return true; } From fecec3d584947ed46d73db2811a648bf0558e746 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 18:55:34 +0200 Subject: [PATCH 062/220] Do not run saveProjectAs on multiple forking threads. The method is supposed to be called NOT on the EDT thread, will still show dialogs on the EDT thread, and will return *only once the project has been saved*. This allows for waiting for the project to be saved before moving on. --- .../org/mastodon/mamut/io/ProjectSaver.java | 179 +++++++++--------- 1 file changed, 88 insertions(+), 91 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java index 61f643539..5fc69ebbc 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java @@ -57,6 +57,8 @@ public class ProjectSaver /** * Interactively saves the specified project. A dialog is shown prompting * the user to a save path. + *

    + * Must not be called on the EDT. * * @param appModel * the project model. @@ -69,111 +71,106 @@ public static synchronized void saveProjectAs( final ProjectModel appModel, fina final MamutProject project = appModel.getProject(); final String projectRoot = getProposedProjectRoot( project ); - new Thread( new Runnable() + try { - @Override - public void run() + + /* + * Check if the image data is based on a non-BDV image. If it's the + * case, offer to convert. + */ + + if ( project instanceof MamutImagePlusProject ) { - try - { - /* - * Check if the image data is based on a non-BDV image. If - * it's the case, offer to convert. - */ + final AtomicInteger returnUserValue = new AtomicInteger( -1 ); + SwingUtilities.invokeAndWait( new Runnable() + { - if ( project instanceof MamutImagePlusProject ) + @Override + public void run() { - - final AtomicInteger returnUserValue = new AtomicInteger( -1 ); - SwingUtilities.invokeAndWait( new Runnable() - { - - @Override - public void run() - { - final int val = JOptionPane.showConfirmDialog( - parentComponent, - "The image data is not currently saved as a BDV file, \n" - + "which is optimal for Mastodon. Mastodon might fail \n" - + "to load the image data when you will reopen the \n" - + "project you are about to save.\n" - + "\n" - + "Do you want to resave the image to the BDV file \n" - + "format prior to saving the Mastodon project? \n" - + "\n" - + "(Clicking 'Yes' will show the BDV exporter \n" - + "interface and close all Mastodon windows, \n" - + "then offer to save the Mastodon project.)", - "Image not in BDV file format", - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE, - MastodonIcons.MASTODON_ICON_MEDIUM ); - returnUserValue.set( val ); - } - } ); - - if ( returnUserValue.get() == JOptionPane.YES_OPTION ) - { - /* - * If the user chose to resave to BDV, then we make - * a new project out of the new data, save it and - * reopen it. - */ - saveAndReopenImagePlusProject( appModel, parentComponent ); - return; - } + final int val = JOptionPane.showConfirmDialog( + parentComponent, + "The image data is not currently saved as a BDV file, \n" + + "which is optimal for Mastodon. Mastodon might fail \n" + + "to load the image data when you will reopen the \n" + + "project you are about to save.\n" + + "\n" + + "Do you want to resave the image to the BDV file \n" + + "format prior to saving the Mastodon project? \n" + + "\n" + + "(Clicking 'Yes' will show the BDV exporter \n" + + "interface and close all Mastodon windows, \n" + + "then offer to save the Mastodon project.)", + "Image not in BDV file format", + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE, + MastodonIcons.MASTODON_ICON_MEDIUM ); + returnUserValue.set( val ); } + } ); + if ( returnUserValue.get() == JOptionPane.YES_OPTION ) + { /* - * Ask for a file path to save to. + * If the user chose to resave to BDV, then we make a new + * project out of the new data, save it and reopen it. */ - - SwingUtilities.invokeAndWait( new Runnable() - { - @Override - public void run() - { - final File file = FileChooser.chooseFile( true, - parentComponent, - projectRoot, - new ExtensionFileFilter( "mastodon" ), - "Save Mastodon Project", - FileChooser.DialogType.SAVE, - SelectionMode.FILES_ONLY, - SAVE_ICON_MEDIUM.getImage() ); - if ( file == null ) - return; - - new Thread( () -> { - try - { - saveProject( file, appModel ); - } - catch ( final IOException e ) - { - JOptionPane.showMessageDialog( - parentComponent, - "Could not save project:\n" + e.getMessage(), - "Error writing to file", - JOptionPane.ERROR_MESSAGE ); - e.printStackTrace(); - } - } ).start(); - } - } ); + saveAndReopenImagePlusProject( appModel, parentComponent ); + return; } - catch ( final InterruptedException | InvocationTargetException | IOException e ) + } + + /* + * Ask for a file path to save to. We want to go on the EDT and keep + * a ref to what we will receive; we use a StringBuilder for that. + */ + final StringBuilder str = new StringBuilder(); + SwingUtilities.invokeAndWait( new Runnable() + { + + @Override + public void run() { - JOptionPane.showMessageDialog( + final File file = FileChooser.chooseFile( true, parentComponent, - "Problem writing the project:\n" + e.getMessage(), - "Error writing to file", - JOptionPane.ERROR_MESSAGE ); - e.printStackTrace(); + projectRoot, + new ExtensionFileFilter( "mastodon" ), + "Save Mastodon Project", + FileChooser.DialogType.SAVE, + SelectionMode.FILES_ONLY, + SAVE_ICON_MEDIUM.getImage() ); + if ( file == null ) + return; + str.append( file.getAbsolutePath() ); } + } ); + if ( str.length() == 0 ) // Abort + return; + + try + { + saveProject( new File( str.toString() ), appModel ); } - } ).start(); + catch ( final IOException e ) + { + JOptionPane.showMessageDialog( + parentComponent, + "Could not save project:\n" + e.getMessage(), + "Error writing to file", + JOptionPane.ERROR_MESSAGE ); + e.printStackTrace(); + } + } + catch ( final InterruptedException | InvocationTargetException | IOException e ) + { + JOptionPane.showMessageDialog( + parentComponent, + "Problem writing the project:\n" + e.getMessage(), + "Error writing to file", + JOptionPane.ERROR_MESSAGE ); + e.printStackTrace(); + } } /** From 0d573b644f30b73bcc89428d3c2db61b65297327 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 18:56:42 +0200 Subject: [PATCH 063/220] Show the project name on the main window. And update it if the user saves the project under another name. Partly addresses #238. --- .../java/org/mastodon/mamut/MainWindow.java | 68 +++++++++++++++++-- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/MainWindow.java b/src/main/java/org/mastodon/mamut/MainWindow.java index 1b2b2f56d..34df5fb94 100644 --- a/src/main/java/org/mastodon/mamut/MainWindow.java +++ b/src/main/java/org/mastodon/mamut/MainWindow.java @@ -44,9 +44,12 @@ import java.awt.BorderLayout; import java.awt.Font; import java.awt.Graphics; +import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.io.File; +import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.ImageIcon; @@ -64,6 +67,7 @@ import org.mastodon.app.MastodonIcons; import org.mastodon.app.ui.ViewMenu; import org.mastodon.mamut.io.ProjectActions; +import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.views.bdv.MamutBranchViewBdvFactory; import org.mastodon.mamut.views.bdv.MamutViewBdvFactory; import org.mastodon.mamut.views.grapher.MamutViewGrapherFactory; @@ -89,7 +93,7 @@ public class MainWindow extends JFrame public MainWindow( final ProjectModel appModel ) { - super( "Mastodon" ); + super( makeName( appModel ) ); this.appModel = appModel; setIconImages( MASTODON_ICON ); setLocationByPlatform( true ); @@ -153,13 +157,13 @@ public MainWindow( final ProjectModel appModel ) ioLabel.setFont( buttonsPanel.getFont().deriveFont( Font.BOLD ) ); buttonsPanel.add( ioLabel, "span, wrap" ); - final JButton saveProjectButton = new JButton( projectActionMap.get( ProjectActions.SAVE_PROJECT ) ); + final JButton saveProjectButton = new JButton( saveAction( projectActionMap.get( ProjectActions.SAVE_PROJECT ) ) ); prepareButton( saveProjectButton, "save", SAVE_ICON_MEDIUM ); buttonsPanel.add( saveProjectButton, "grow" ); - final JButton loadProjectButton = new JButton( projectActionMap.get( ProjectActions.SAVE_PROJECT_AS ) ); - prepareButton( loadProjectButton, "save as...", SAVE_AS_ICON_MEDIUM ); - buttonsPanel.add( loadProjectButton, "grow, wrap" ); + final JButton saveProjectAsButton = new JButton( saveAction( projectActionMap.get( ProjectActions.SAVE_PROJECT_AS ) ) ); + prepareButton( saveProjectAsButton, "save as...", SAVE_AS_ICON_MEDIUM ); + buttonsPanel.add( saveProjectAsButton, "grow, wrap" ); /* * Background with an image. @@ -209,6 +213,60 @@ public void windowClosing( final WindowEvent e ) appModel.projectClosedListeners().add( () -> dispose() ); } + /** + * Adds a hook to a save action so that we update the title with the new + * project name after saving. + * + * @param action + * the save action. + * @return a wrapping action. + */ + private Action saveAction( final Action action ) + { + return new AbstractAction() + { + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed( final ActionEvent e ) + { + new Thread( () -> { + action.actionPerformed( e ); + updateTitle(); + } ).start(); + } + }; + } + + private void updateTitle() + { + setTitle( makeName( appModel ) ); + } + + private static final String makeName( final ProjectModel pm ) + { + String extra = ""; + final MamutProject project = pm.getProject(); + if ( project != null ) + { + final File projectRoot = project.getProjectRoot(); + if ( projectRoot != null ) + { + extra = " - " + projectRoot.getName(); + } + else + { + final File datasetXmlFile = project.getDatasetXmlFile(); + if ( datasetXmlFile != null ) + extra = " - " + datasetXmlFile.getName(); + } + } + final int index = extra.lastIndexOf( '.' ); + extra = ( index < 0 ) ? extra : extra.substring( 0, index ); + return "Mastodon" + extra; + } + /** * Closes all the windows opened in Mastodon, this main window. If the model * has been modified and not saved, prompts the user for confirmation. From 9ef123f8cf877b3768c537c399e328f6047bbacb Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 18:56:52 +0200 Subject: [PATCH 064/220] Some javadoc. --- .../java/org/mastodon/mamut/io/ProjectActions.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectActions.java b/src/main/java/org/mastodon/mamut/io/ProjectActions.java index 621a5ebb9..b60614103 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectActions.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectActions.java @@ -62,6 +62,18 @@ public static void installGlobalActions( final Actions actions, final Context co actions.namedAction( importMamutAction, IMPORT_MAMUT_KEYS ); } + /** + * Installs the save and import actions onto the specified {@link Actions} + * object. + * + * @param actions + * the actions to install to. + * @param appModel + * the project model. + * @param parentComponent + * a component to use as parent in dialog (can be + * null). + */ public static void installAppActions( final Actions actions, final ProjectModel appModel, final Frame parentComponent ) { final RunnableAction saveProjectAction = new RunnableAction( SAVE_PROJECT, () -> ProjectSaver.saveProject( appModel, parentComponent ) ); @@ -104,7 +116,7 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) descriptions.add( EXPORT_MAMUT, EXPORT_MAMUT_KEYS, "Export current project as a MaMuT project." ); } } - + private static final class BasicErrorLogger implements Consumer< String > { From 832220ec2770f5f510479cbbdeadcb5f3ec9f632 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 19:36:53 +0200 Subject: [PATCH 065/220] The ProjectModel can return a suitable project name. --- .../java/org/mastodon/mamut/ProjectModel.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/main/java/org/mastodon/mamut/ProjectModel.java b/src/main/java/org/mastodon/mamut/ProjectModel.java index 9d06d157f..06d96490f 100644 --- a/src/main/java/org/mastodon/mamut/ProjectModel.java +++ b/src/main/java/org/mastodon/mamut/ProjectModel.java @@ -28,6 +28,7 @@ */ package org.mastodon.mamut; +import java.io.File; import java.util.function.Consumer; import org.mastodon.app.MastodonAppModel; @@ -213,6 +214,33 @@ public MamutProject getProject() return project; } + /** + * Returns a suitable project name for the project managed in this model. + * + * @return the project name. + */ + public String getProjectName() + { + String name = ""; + if ( project != null ) + { + final File projectRoot = project.getProjectRoot(); + if ( projectRoot != null ) + { + name = projectRoot.getName(); + } + else + { + final File datasetXmlFile = project.getDatasetXmlFile(); + if ( datasetXmlFile != null ) + name = datasetXmlFile.getName(); + } + } + final int index = name.lastIndexOf( '.' ); + name = ( index < 0 ) ? name : name.substring( 0, index ); + return name; + } + public static ProjectModel create( final Context context, final Model model, final SharedBigDataViewerData imageData, final MamutProject project ) { final KeyPressedManager keyPressedManager = new KeyPressedManager(); From c2f8cea19ec347f59a7b6a8e39cde350b5ac6383 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 19:38:41 +0200 Subject: [PATCH 066/220] The window manager manages a list of extra windows. And it and can update their title. The dialog windows are stored in a separate list than from the view. There is a method to run an action on all opened windows, dialogs and mamut view. --- .../org/mastodon/mamut/WindowManager.java | 84 ++++++++++++++++--- 1 file changed, 72 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 6ccf44df3..bd5d8952f 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -49,6 +49,7 @@ import javax.swing.ActionMap; import javax.swing.JDialog; +import javax.swing.JFrame; import org.mastodon.app.plugin.PluginUtils; import org.mastodon.app.ui.ViewMenu; @@ -137,6 +138,12 @@ public class WindowManager private final PreferencesDialog settings; + /** + * The list of windows, that are not Mamut views, registered to this window + * manager. + */ + private final List< Window > registeredWindows = new ArrayList<>(); + private final ProjectModel appModel; private final MamutViews mamutViews; @@ -220,6 +227,14 @@ public WindowManager( final ProjectModel appModel ) tagSetDialog.setIconImages( TAGS_ICON ); featureComputationDialog = MamutFeatureComputation.getDialog( appModel, context ); featureComputationDialog.setIconImages( FEATURES_ICON ); + + /* + * Register windows. + */ + registeredWindows.add( featureComputationDialog ); + registeredWindows.add( tagSetDialog ); + registeredWindows.add( settings ); + forEachWindow( w -> adjustTitle( w, appModel.getProjectName() ) ); } /** @@ -265,6 +280,9 @@ public synchronized < T extends MamutViewI > T createView( final Class< T > klas // Create the view. final T view = factory.create( appModel ); + // Adjust the frame name. + adjustTitle( view.getFrame(), appModel.getProjectName() ); + // Restore the view GUI state. factory.restoreGuiState( view, guiState ); @@ -438,6 +456,20 @@ public void forEachView( final Consumer< ? super MamutViewI > action ) openedViews.forEach( ( k, l ) -> l.forEach( action ) ); } + /** + * Executes the specified actions for all the windows currently opened and + * managed by this window manager. This includes the Mamut views, and the + * various dialogs. + * + * @param action + * the action to execute. + */ + public void forEachWindow( final Consumer< ? super Window > action ) + { + forEachView( v -> action.accept( v.getFrame() ) ); + registeredWindows.forEach( action ); + } + /** * Opens the online documentation in a browser window. */ @@ -477,10 +509,7 @@ public void computeFeatures() public void closeAllWindows() { final ArrayList< Window > windows = new ArrayList<>(); - forEachView( v -> windows.add( v.getFrame() ) ); - windows.add( tagSetDialog ); - windows.add( featureComputationDialog ); - + forEachWindow( w -> windows.add( w ) ); try { InvokeOnEDT.invokeAndWait( @@ -500,14 +529,6 @@ public void closeAllWindows() } } - /** - * This method is called when the MainWindow is closed. - */ - public void dispose() - { - settings.dispose(); - } - /** * Exposes the preferences dialog, in which configuration options are * listed. @@ -582,4 +603,43 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) "Show the feature computation dialog." ); } } + + /** + * Possibly appends the project name to a given window title, making sure we + * do not append to an already appended project name. + * + * @param title + * the initial window name. + * @param projectName + * the project name. + * @return an adjusted window name. + */ + private static final String adjustTitle( final String title, final String projectName ) + { + if ( projectName == null || projectName.isEmpty() ) + return title; + + final String separator = " - "; + final int index = title.indexOf( separator ); + final String prefix = ( index < 0 ) ? title : title.substring( 0, index ); + return prefix + separator + projectName; + } + + public static void adjustTitle( final JDialog dialog, final String projectName ) + { + dialog.setTitle( adjustTitle( dialog.getTitle(), projectName ) ); + } + + public static void adjustTitle( final JFrame frame, final String projectName ) + { + frame.setTitle( adjustTitle( frame.getTitle(), projectName ) ); + } + + public static void adjustTitle( final Window w, final String projectName ) + { + if ( w instanceof JDialog ) + adjustTitle( ( JDialog ) w, projectName ); + else if ( w instanceof JFrame ) + adjustTitle( ( JFrame ) w, projectName ); + } } From 4a95609efe224cd79853fa7da980334b51b00cb9 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Thu, 24 Aug 2023 19:39:28 +0200 Subject: [PATCH 067/220] Update all the window names when a project change name. After saving a project, all the opened windows update their title to reflect the new name. Fix #238 --- .../java/org/mastodon/mamut/MainWindow.java | 30 +++++-------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/MainWindow.java b/src/main/java/org/mastodon/mamut/MainWindow.java index 34df5fb94..e441349cb 100644 --- a/src/main/java/org/mastodon/mamut/MainWindow.java +++ b/src/main/java/org/mastodon/mamut/MainWindow.java @@ -47,7 +47,6 @@ import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import java.io.File; import javax.swing.AbstractAction; import javax.swing.Action; @@ -67,7 +66,6 @@ import org.mastodon.app.MastodonIcons; import org.mastodon.app.ui.ViewMenu; import org.mastodon.mamut.io.ProjectActions; -import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.views.bdv.MamutBranchViewBdvFactory; import org.mastodon.mamut.views.bdv.MamutViewBdvFactory; import org.mastodon.mamut.views.grapher.MamutViewGrapherFactory; @@ -233,38 +231,24 @@ public void actionPerformed( final ActionEvent e ) { new Thread( () -> { action.actionPerformed( e ); - updateTitle(); + updateWindowNames(); } ).start(); } }; } - private void updateTitle() + private void updateWindowNames() { + appModel.getWindowManager().forEachWindow( w -> WindowManager.adjustTitle( w, appModel.getProjectName() ) ); setTitle( makeName( appModel ) ); } private static final String makeName( final ProjectModel pm ) { - String extra = ""; - final MamutProject project = pm.getProject(); - if ( project != null ) - { - final File projectRoot = project.getProjectRoot(); - if ( projectRoot != null ) - { - extra = " - " + projectRoot.getName(); - } - else - { - final File datasetXmlFile = project.getDatasetXmlFile(); - if ( datasetXmlFile != null ) - extra = " - " + datasetXmlFile.getName(); - } - } - final int index = extra.lastIndexOf( '.' ); - extra = ( index < 0 ) ? extra : extra.substring( 0, index ); - return "Mastodon" + extra; + final String extra = pm.getProjectName(); + if ( extra == null || extra.isEmpty() ) + return "Mastodon"; + return "Mastodon - " + extra; } /** From beff479f05c746ac0dabbe406eb41a64e848eaa7 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 25 Aug 2023 11:04:05 +0200 Subject: [PATCH 068/220] The interactive LauncherUtils methods should not throw exceptions. But instead catch them and make an error message. --- .../mastodon/mamut/launcher/LauncherUtil.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java b/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java index 6b11dfb3c..18dfacf75 100644 --- a/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java +++ b/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java @@ -167,11 +167,6 @@ public static ProjectModel createProjectFromBdvFileWithDialog( final File file, * @return the loaded {@link ProjectModel}, or null if the * image cannot be loaded and the user declined to substitute a * dummy dataset. - * @throws IOException - * if the project points to a regular image file for image data, - * and that file cannot be opened properly, or if there is a - * problem loading the model data, or if there is a problem - * reading the GUI state. */ public static final ProjectModel openWithDialog( final Context context, final Component parentComponent, final Consumer< String > errorConsumer ) { @@ -228,10 +223,19 @@ else if ( project != null && project.getProjectRoot() != null ) * @return the loaded {@link ProjectModel}. * */ - public static synchronized ProjectModel openWithDialog( final String mastodonFile, final Context context, final Consumer< String > errorConsumer ) throws IOException, SpimDataException + public static synchronized ProjectModel openWithDialog( final String mastodonFile, final Context context, final Consumer< String > errorConsumer ) { - final MamutProject project = MamutProjectIO.load( mastodonFile ); - return openWithDialog( project, context, errorConsumer ); + MamutProject project = null; + try + { + project = MamutProjectIO.load( mastodonFile ); + return openWithDialog( project, context, errorConsumer ); + } + catch ( final IOException e ) + { + errorConsumer.accept( getProblemDescription( project, e ) ); + } + return null; } /** @@ -239,7 +243,7 @@ public static synchronized ProjectModel openWithDialog( final String mastodonFil *

    * If the image data cannot be loaded a dialog shows up telling the user * about the problem, and offering to start Mastodon on substituted dummy - * image data. If the user declines, a {@link SpimDataException} is thrown. + * image data. *

    * The GUI state is restored. * @@ -250,15 +254,11 @@ public static synchronized ProjectModel openWithDialog( final String mastodonFil * @param errorConsumer * a consumer that will receive an user-readable error message if * something wrong happens. - * * @return the loaded {@link ProjectModel}, or null if the * image cannot be loaded and the user declined to substitute a * dummy dataset. - * @param errorConsumer - * a consumer that will receive an user-readable error message if - * something wrong happens. */ - public static synchronized ProjectModel openWithDialog( final MamutProject project, final Context context, final Consumer< String > errorConsumer ) throws IOException, SpimDataException + public static synchronized ProjectModel openWithDialog( final MamutProject project, final Context context, final Consumer< String > errorConsumer ) { return openWithDialog( project, context, null, errorConsumer ); } From a01796351afa249b1d9781651022079d696df6fe Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 25 Aug 2023 11:04:41 +0200 Subject: [PATCH 069/220] Fix javadoc errors. --- .../org/mastodon/mamut/WindowManager.java | 28 ++++++++++++------- .../org/mastodon/mamut/io/ProjectCreator.java | 3 ++ .../mastodon/mamut/io/ProjectImporter.java | 6 ++-- .../mastodon/mamut/views/MamutBranchView.java | 2 +- .../mamut/views/bdv/MamutViewBdvFactory.java | 3 -- .../grapher/MamutViewGrapherFactory.java | 4 --- .../views/table/MamutViewTableFactory.java | 2 +- 7 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index bd5d8952f..3a28c72c2 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -61,7 +61,6 @@ import org.mastodon.mamut.model.Spot; import org.mastodon.mamut.views.MamutViewFactory; import org.mastodon.mamut.views.MamutViewI; -import org.mastodon.mamut.views.bdv.MamutViewBdv; import org.mastodon.model.tag.ui.TagSetDialog; import org.mastodon.ui.coloring.feature.FeatureColorModeManager; import org.mastodon.ui.keymap.KeyConfigContexts; @@ -89,9 +88,7 @@ * Main GUI class for the Mastodon Mamut application. *

    * It controls the creation of new views, and maintain a list of currently - * opened views. It has a {@link #getProjectManager()} instance that can be used - * to open or create Mastodon projects. It has also the main app-model for the - * session. + * opened views, along with the managers that they may need. * * @author Tobias Pietzsch * @author Jean-Yves Tinevez @@ -149,11 +146,12 @@ public class WindowManager private final MamutViews mamutViews; /** - * Creates a new, empty WindowManager instance using the specified context. + * Creates new WindowManager. + * + * @param appModel + * the parent project model instance. This window manager + * instance will be a component of this project model. * - * @param context - * the context to use. Cannot be null. - * @param globalActions */ public WindowManager( final ProjectModel appModel ) { @@ -568,11 +566,21 @@ private CommandDescriptions buildCommandDescriptions() } /** - * Classes that implement {@link BdvViewCreatedListener} get a notification - * when a new {@link MamutViewBdv} instance is created. + * Interface for listeners that are notified of the creation of views of the + * specified class. Registered listeners will be notified when a view of the + * specific class is created. + * + * @param + * the class of the view to listen for the creation of. */ public interface ViewCreatedListener< T extends MamutViewI > { + /** + * Called when a view of the class is created, just before it is shown. + * + * @param view + * the view that was just created. + */ void viewCreated( final T view ); } diff --git a/src/main/java/org/mastodon/mamut/io/ProjectCreator.java b/src/main/java/org/mastodon/mamut/io/ProjectCreator.java index c5040d0cb..cbce52f0e 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectCreator.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectCreator.java @@ -161,6 +161,9 @@ public static synchronized ProjectModel createProjectFromUrl( final Context cont * @param context * the current context. * @return a new {@link ProjectModel}. + * @throws SpimDataException + * SpimDataException if the project points to a BDV file for + * image data, and that BDV cannot be opened properly. */ public static ProjectModel createProjectFromImp( final ImagePlus imp, final Context context ) throws SpimDataException { diff --git a/src/main/java/org/mastodon/mamut/io/ProjectImporter.java b/src/main/java/org/mastodon/mamut/io/ProjectImporter.java index 1245bf29e..83b42bd26 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectImporter.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectImporter.java @@ -69,7 +69,8 @@ public static synchronized ProjectModel openMamutWithDialog( final Component par * Shows an importer window that allows importing data from a Simi Biocell * file. The cell data is added to the existing project. * - * @see http://www.simi.com/en/products/cell-research.html + * @see http://www.simi.com/en/products/cell-research.html * * @param appModel * the project to add the data to. @@ -86,7 +87,8 @@ public static synchronized void importSimiDataWithDialog( final ProjectModel app * Shows an importer window that allows importing data from a TGMM file. The * cell data is added to the existing project. * - * @see https://github.com/KellerLabTeam/tgmm-docker + * @see https://github.com/KellerLabTeam/tgmm-docker * * @param appModel * the project to add the data to. diff --git a/src/main/java/org/mastodon/mamut/views/MamutBranchView.java b/src/main/java/org/mastodon/mamut/views/MamutBranchView.java index 1cbf0280f..40249839c 100644 --- a/src/main/java/org/mastodon/mamut/views/MamutBranchView.java +++ b/src/main/java/org/mastodon/mamut/views/MamutBranchView.java @@ -106,7 +106,7 @@ public class MamutBranchView< /** * Key that specifies settings specific to the branch-graph view in a common - * view. Values are Map. + * view. Values are Map<String, Object>. */ public static final String BRANCH_GRAPH = "BranchGraph"; diff --git a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java index ab2e0b009..44d7a903f 100644 --- a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java @@ -57,9 +57,6 @@ public class MamutViewBdvFactory extends AbstractMamutViewFactory< MamutViewBdv /** * Key for the {@link ViewerState} in a BDV view. Value is a XML * {@link Element} serialized from the state. - * - * @see ViewerPanelMamut#stateToXml() - * @see ViewerPanelMamut#stateFromXml(Element) */ public static final String BDV_STATE_KEY = "BdvState"; diff --git a/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java b/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java index 0f4562b68..30d23cf66 100644 --- a/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java +++ b/src/main/java/org/mastodon/mamut/views/grapher/MamutViewGrapherFactory.java @@ -37,11 +37,7 @@ *

  • 'GrapherTransform' → a * {@link org.mastodon.views.grapher.datagraph.ScreenTransform} specifying the * region to initially zoom on the XY plot. - * *
- * - * @param guiState - * the map of settings. */ @Plugin( type = MamutViewFactory.class, priority = Priority.NORMAL - 4 ) public class MamutViewGrapherFactory extends AbstractMamutViewFactory< MamutViewGrapher > diff --git a/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java b/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java index bc877837d..404ab9601 100644 --- a/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java +++ b/src/main/java/org/mastodon/mamut/views/table/MamutViewTableFactory.java @@ -82,7 +82,7 @@ public class MamutViewTableFactory extends AbstractMamutViewFactory< MamutViewTa /** * Key to the parameter that stores the GUI states of multiple tables. Value - * is a List>. + * is a List<Map<String, Object>>. */ public static final String TABLE_ELEMENT = "Tables"; From 19a6ba8d73e0542afb3919a778900444811d606e Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 25 Aug 2023 11:37:53 +0200 Subject: [PATCH 070/220] Fix javadoc warnings. --- .../org/mastodon/app/IdentityViewGraph.java | 4 + .../mastodon/app/ui/SearchVertexLabel.java | 4 + .../update/GraphFeatureUpdateListeners.java | 5 +- .../mamut/BranchGraphUndoActions.java | 5 +- .../java/org/mastodon/mamut/ProjectModel.java | 2 + .../org/mastodon/mamut/WindowManager.java | 2 + .../org/mastodon/mamut/io/ProjectActions.java | 8 + .../mastodon/mamut/launcher/LauncherUtil.java | 4 +- .../org/mastodon/mamut/model/ModelUtils.java | 2 + .../mastodon/model/DefaultFadingModel.java | 3 + .../mastodon/util/DepthFirstIteration.java | 17 +- .../java/org/mastodon/util/DummySpimData.java | 15 +- .../java/org/mastodon/util/TagHelper.java | 92 +++++-- .../java/org/mastodon/util/TagSetUtils.java | 252 ++++++++++++------ .../java/org/mastodon/util/TreeUtils.java | 88 ++++-- .../views/bdv/SharedBigDataViewerData.java | 4 + .../bdv/overlay/OverlayGraphRenderer.java | 41 ++- .../grapher/datagraph/DataGraphLayout.java | 15 +- .../views/table/TableViewFrameBuilder.java | 1 + .../org/mastodon/StartMastodonOnProject.java | 3 +- 20 files changed, 406 insertions(+), 161 deletions(-) diff --git a/src/main/java/org/mastodon/app/IdentityViewGraph.java b/src/main/java/org/mastodon/app/IdentityViewGraph.java index 91218b929..93ebd1f78 100644 --- a/src/main/java/org/mastodon/app/IdentityViewGraph.java +++ b/src/main/java/org/mastodon/app/IdentityViewGraph.java @@ -184,6 +184,10 @@ public void releaseRef( final O ref ) * @param idBimap * a {@link GraphIdBimap} for the wrapped graph. * @return an identity wrapper graph. + * @param + * the type of vertices in the graph. + * @param + * the type of edges in the graph. */ public static final < V extends Vertex< E >, E extends Edge< V > > ViewGraph< V, E, V, E > wrap( final ReadOnlyGraph< V, E > graph, final GraphIdBimap< V, E > idBimap ) diff --git a/src/main/java/org/mastodon/app/ui/SearchVertexLabel.java b/src/main/java/org/mastodon/app/ui/SearchVertexLabel.java index 69b6bec7b..d9c36f04f 100644 --- a/src/main/java/org/mastodon/app/ui/SearchVertexLabel.java +++ b/src/main/java/org/mastodon/app/ui/SearchVertexLabel.java @@ -129,6 +129,10 @@ public class SearchVertexLabel< V extends Vertex< E > & HasLabel & Ref< V >, E e * the component to focus back to, when the use presses ESCAPE in * the search text field. * @return a new panel containing the search field. + * @param + * the type of vertices in the graph to search. + * @param + * the type of edges in the graph to search. */ public static < V extends Vertex< E > & HasLabel & Ref< V >, E extends Edge< V > > JPanel install( diff --git a/src/main/java/org/mastodon/feature/update/GraphFeatureUpdateListeners.java b/src/main/java/org/mastodon/feature/update/GraphFeatureUpdateListeners.java index c070cddf7..c8ee15ba8 100644 --- a/src/main/java/org/mastodon/feature/update/GraphFeatureUpdateListeners.java +++ b/src/main/java/org/mastodon/feature/update/GraphFeatureUpdateListeners.java @@ -56,8 +56,11 @@ public class GraphFeatureUpdateListeners * the class of vertices in the model. * @param edgeClass * the class of edges in the model. - * * @return a new {@link PropertyChangeListener}. + * @param + * the type of vertices. + * @param + * the type of edges. */ public static < V extends Vertex< E >, E extends Edge< V > > PropertyChangeListener< V > vertexPropertyListener( final FeatureModel featureModel, final Class< V > vertexClass, final Class< E > edgeClass ) diff --git a/src/main/java/org/mastodon/mamut/BranchGraphUndoActions.java b/src/main/java/org/mastodon/mamut/BranchGraphUndoActions.java index bac2879ee..7c3db085c 100644 --- a/src/main/java/org/mastodon/mamut/BranchGraphUndoActions.java +++ b/src/main/java/org/mastodon/mamut/BranchGraphUndoActions.java @@ -68,12 +68,15 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) /** * Create Undo/Redo actions and install them in the specified * {@link Actions}. - * @param actions + * + * @param actions * Actions are added here. * @param model * Actions are targeted at this {@link Model}s {@code undo()} and * {@code redo()} methods. * @param branchGraphSync + * the branch sync object, used to regenerate the branch graph + * when the core model changes. */ public static void install( final Actions actions, final Model model, final BranchGraphSynchronizer branchGraphSync ) { diff --git a/src/main/java/org/mastodon/mamut/ProjectModel.java b/src/main/java/org/mastodon/mamut/ProjectModel.java index 06d96490f..302486f13 100644 --- a/src/main/java/org/mastodon/mamut/ProjectModel.java +++ b/src/main/java/org/mastodon/mamut/ProjectModel.java @@ -190,6 +190,8 @@ public void close() /** * Listeners that are notified when the Mastodon project is closed. + * + * @return the {@link Listeners}. */ public Listeners< CloseListener > projectClosedListeners() { diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 3a28c72c2..0911a0f93 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -435,6 +435,8 @@ private < T extends MamutViewI > List< T > getViewList( final Class< T > klass ) * the action to execute. * @param klass * the view class. + * @param + * the type of the view to operate on. */ public < T extends MamutViewI > void forEachView( final Class< T > klass, final Consumer< T > action ) { diff --git a/src/main/java/org/mastodon/mamut/io/ProjectActions.java b/src/main/java/org/mastodon/mamut/io/ProjectActions.java index b60614103..be1b2e585 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectActions.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectActions.java @@ -47,6 +47,14 @@ public class ProjectActions * Install the global actions for creating, loading or importing a new * project. These actions relates to the app context where an app model does * not exist yet (they create it). + * + * @param actions + * the {@link Actions} to register to. + * @param context + * the current context. + * @param parentComponent + * a component to use as parent when showing dialogs. Can be + * null. */ public static void installGlobalActions( final Actions actions, final Context context, final Component parentComponent ) { diff --git a/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java b/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java index 18dfacf75..d1a896600 100644 --- a/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java +++ b/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java @@ -130,7 +130,9 @@ public static synchronized ProjectModel createProjectWithDialog( final Context c * If the specified BDV file cannot be loaded a dialog shows up telling the * user about the problem, and offering to start Mastodon on substituted * dummy image data. - * + * + * @param file + * the BDX XML file. * @param context * the current context. * @param parentComponent diff --git a/src/main/java/org/mastodon/mamut/model/ModelUtils.java b/src/main/java/org/mastodon/mamut/model/ModelUtils.java index 589e763e8..3538b577e 100644 --- a/src/main/java/org/mastodon/mamut/model/ModelUtils.java +++ b/src/main/java/org/mastodon/mamut/model/ModelUtils.java @@ -71,6 +71,8 @@ public static final String dump( final Model model ) * * @param model * the model. + * @param maxLines + * the max number of rows to print in the two tables. * @return a String representation of the model. */ public static final String dump( final Model model, final long maxLines ) diff --git a/src/main/java/org/mastodon/model/DefaultFadingModel.java b/src/main/java/org/mastodon/model/DefaultFadingModel.java index 25554c3d3..9a4549d87 100644 --- a/src/main/java/org/mastodon/model/DefaultFadingModel.java +++ b/src/main/java/org/mastodon/model/DefaultFadingModel.java @@ -13,6 +13,9 @@ public class DefaultFadingModel /** * Creates a new Fading Model for the specified graph. + * + * @param timepointModel + * the timepoint model to base this fading model on. */ public DefaultFadingModel( final TimepointModel timepointModel ) { diff --git a/src/main/java/org/mastodon/util/DepthFirstIteration.java b/src/main/java/org/mastodon/util/DepthFirstIteration.java index c5489131f..253ac6a69 100644 --- a/src/main/java/org/mastodon/util/DepthFirstIteration.java +++ b/src/main/java/org/mastodon/util/DepthFirstIteration.java @@ -73,21 +73,20 @@ * *
  * {@code
- * for ( DepthFirstIteration.Step step : DepthFirstIteration.forRoot( graph, root ) )
+ * for ( DepthFirstIteration.Step< Spot > step : DepthFirstIteration.forRoot( graph, root ) )
  * {
- *     Spot node = step.node();
- *     if ( step.isFirstVisit() )
- *        System.out.println( "first visit " + node.getLabel() );
- *     if ( step.isSecondVisit() )
- *        System.out.println( "second visit " + node.getLabel() );
- *     if ( step.isLeaf() )
- *        System.out.println( "leaf " + node.getLabel() );
+ * 	Spot node = step.node();
+ * 	if ( step.isFirstVisit() )
+ * 		System.out.println( "first visit " + node.getLabel() );
+ * 	if ( step.isSecondVisit() )
+ * 		System.out.println( "second visit " + node.getLabel() );
+ * 	if ( step.isLeaf() )
+ * 		System.out.println( "leaf " + node.getLabel() );
  * }
  * }
  * 
* * It will print the following on the console: - *

* *

  * first visit a
diff --git a/src/main/java/org/mastodon/util/DummySpimData.java b/src/main/java/org/mastodon/util/DummySpimData.java
index 63438e952..38e0c1c44 100644
--- a/src/main/java/org/mastodon/util/DummySpimData.java
+++ b/src/main/java/org/mastodon/util/DummySpimData.java
@@ -159,10 +159,17 @@ private static double get( final String[] parts, final String key, final double
 	}
 
 	/**
-	 * @return a {@link AbstractSpimData} object. Pixel sizes, image sizes, and
-	 *         image transformations are read from the given BigDataViewer XML.
-	 *         The actual image data is not loaded, all pixels are black.
-	 *         {@link DummyImgLoader} is used to provide the dummy image data.
+	 * Returns a new {@link AbstractSpimData} object.Pixel sizes, image sizes,
+	 * and image transformations are read from the given BigDataViewer XML. The
+	 * actual image data is not loaded, all pixels are black.
+	 * {@link DummyImgLoader} is used to provide the dummy image data.
+	 * 
+	 * @param spimDataXmlFilename
+	 *            the spim data file name.
+	 * @return a {@link AbstractSpimData} object.
+	 * @throws SpimDataException
+	 *             if something wrong happens when building the spim data
+	 *             object.
 	 */
 	public static AbstractSpimData< ? > fromSpimDataXml( final String spimDataXmlFilename )
 			throws SpimDataException
diff --git a/src/main/java/org/mastodon/util/TagHelper.java b/src/main/java/org/mastodon/util/TagHelper.java
index 4f38f4f67..a92fe3ea9 100644
--- a/src/main/java/org/mastodon/util/TagHelper.java
+++ b/src/main/java/org/mastodon/util/TagHelper.java
@@ -31,7 +31,7 @@ public class TagHelper
 
 	private final ObjTagMap< Link, TagSetStructure.Tag > edgeTags;
 
-	public TagHelper( Model model, TagSetStructure.TagSet tagSet, TagSetStructure.Tag tag )
+	public TagHelper( final Model model, final TagSetStructure.TagSet tagSet, final TagSetStructure.Tag tag )
 	{
 		this.model = Objects.requireNonNull( model );
 		this.tagSet = Objects.requireNonNull( tagSet );
@@ -44,18 +44,20 @@ public TagHelper( Model model, TagSetStructure.TagSet tagSet, TagSetStructure.Ta
 			throw new NoSuchElementException( "Tag set " + tagSet + " is not registered in the model." );
 	}
 
-	public TagHelper( Model model, TagSetStructure.TagSet tagSet, String tagLabel )
+	public TagHelper( final Model model, final TagSetStructure.TagSet tagSet, final String tagLabel )
 	{
 		this( model, tagSet, TagSetUtils.findTag( tagSet, tagLabel ) );
 	}
 
-	public TagHelper( Model model, String tagSetName, String tagLabel )
+	public TagHelper( final Model model, final String tagSetName, final String tagLabel )
 	{
 		this( model, TagSetUtils.findTagSet( model, tagSetName ), tagLabel );
 	}
 
 	/**
 	 * Returns the tag set this tag belongs to.
+	 * 
+	 * @return the tag set this tag belongs to.
 	 */
 	public TagSetStructure.TagSet getTagSet()
 	{
@@ -64,6 +66,8 @@ public TagSetStructure.TagSet getTagSet()
 
 	/**
 	 * Returns the tag that is represented by this {@link TagHelper}.
+	 * 
+	 * @return the tag.
 	 */
 	public TagSetStructure.Tag getTag()
 	{
@@ -72,93 +76,127 @@ public TagSetStructure.Tag getTag()
 
 	/**
 	 * Assigns the tag to the specified spot.
+	 * 
+	 * @param spot
+	 *            the spot to associate to tag to.
 	 */
-	public void tagSpot( Spot spot )
+	public void tagSpot( final Spot spot )
 	{
 		vertexTags.set( spot, tag );
 	}
 
 	/**
 	 * Assigns the tag to the specified link.
+	 * 
+	 * @param link
+	 *            the link to associate the tag to.
 	 */
-	public void tagLink( Link link )
+	public void tagLink( final Link link )
 	{
 		edgeTags.set( link, tag );
 	}
 
 	/**
-	 * Returns true is the specified spot is tagged with this tag.
+	 * Returns true is the specified spot is tagged with this tag.
+	 * 
+	 * @param spot
+	 *            the spot.
+	 * @return true is the specified spot is tagged with this tag.
 	 */
-	public boolean isTagged( Spot spot )
+	public boolean isTagged( final Spot spot )
 	{
 		return vertexTags.get( spot ) == tag;
 	}
 
 	/**
-	 * Returns true is the specified link is tagged with this tag.
+	 * Returns true is the specified link is tagged with this tag.
+	 * 
+	 * @param link
+	 *            the link.
+	 * @return true is the specified link is tagged with this tag.
 	 */
-	public boolean isTagged( Link link )
+	public boolean isTagged( final Link link )
 	{
 		return edgeTags.get( link ) == tag;
 	}
 
 	/**
 	 * Assigns the tag to the specified spot and all its incoming edges.
+	 * 
+	 * @param spot
+	 *            the spot.
 	 */
-	public void tagSpotAndIncomingEdges( Spot spot )
+	public void tagSpotAndIncomingEdges( final Spot spot )
 	{
 		tagSpot( spot );
-		for ( Link link : spot.incomingEdges() )
+		for ( final Link link : spot.incomingEdges() )
 			tagLink( link );
 	}
 
 	/**
 	 * Assigns the tag to the specified spot and all its outgoing edges.
+	 * 
+	 * @param spot
+	 *            the spot.
 	 */
-	public void tagSpotAndOutgoingEdges( Spot spot )
+	public void tagSpotAndOutgoingEdges( final Spot spot )
 	{
 		tagSpot( spot );
-		for ( Link link : spot.outgoingEdges() )
+		for ( final Link link : spot.outgoingEdges() )
 			tagLink( link );
 	}
 
 	/**
-	 * Removes the tag from the specified spot. This also removes any other
-	 * tag in the same tag set from the spot.
+	 * Removes the tag from the specified spot. This also removes any other tag
+	 * in the same tag set from the spot.
+	 * 
+	 * @param spot
+	 *            the spot.
 	 */
-	public void untagSpot( Spot spot )
+	public void untagSpot( final Spot spot )
 	{
 		vertexTags.remove( spot );
 	}
 
 	/**
-	 * Removes the tag from the specified link. This also removes any other
-	 * tag in the same tag set from the link.
+	 * Removes the tag from the specified link. This also removes any other tag
+	 * in the same tag set from the link.
+	 * 
+	 * @param link
+	 *            the link.
 	 */
-	public void untagLink( Link link )
+	public void untagLink( final Link link )
 	{
 		edgeTags.remove( link );
 	}
 
 	/**
 	 * Assigns the tag to the branch that the specified spot belongs to.
+	 * 
+	 * @param spot
+	 *            the spot to find the branch from.
 	 */
-	public void tagBranch( Spot spot )
+	public void tagBranch( final Spot spot )
 	{
 		forEachSpotAndLinkOfTheBranch( model.getGraph(), spot, this::tagSpot, this::tagLink );
 	}
 
 	/**
-	 * Removes the tag from the branch that the specified spot belongs to.
-	 * This also removes any other tag in the same tag set from the branch.
+	 * Removes the tag from the branch that the specified spot belongs to. This
+	 * also removes any other tag in the same tag set from the branch.
+	 * 
+	 * @param spot
+	 *            the spot to find the branch from.
 	 */
-	public void untagBranch( Spot spot )
+	public void untagBranch( final Spot spot )
 	{
 		forEachSpotAndLinkOfTheBranch( model.getGraph(), spot, this::untagSpot, this::untagLink );
 	}
 
 	/**
 	 * Returns all spots that are tagged with this tag.
+	 * 
+	 * @return the spots.
 	 */
 	public Collection< Spot > getTaggedSpots()
 	{
@@ -167,6 +205,8 @@ public Collection< Spot > getTaggedSpots()
 
 	/**
 	 * Returns all links that are tagged with this tag.
+	 * 
+	 * @return the links.
 	 */
 	public Collection< Link > getTaggedLinks()
 	{
@@ -185,7 +225,7 @@ public Collection< Link > getTaggedLinks()
 	 * @param spotAction This action is performed on each spot of the branch.
 	 * @param linkAction This action is performed on each link of the branch.
 	 */
-	private void forEachSpotAndLinkOfTheBranch( ModelGraph graph, Spot spot, Consumer< Spot > spotAction, Consumer< Link > linkAction )
+	private void forEachSpotAndLinkOfTheBranch( final ModelGraph graph, final Spot spot, final Consumer< Spot > spotAction, final Consumer< Link > linkAction )
 	{
 		Spot s = graph.vertexRef();
 		try
@@ -195,7 +235,7 @@ private void forEachSpotAndLinkOfTheBranch( ModelGraph graph, Spot spot, Consume
 			s.refTo( spot );
 			while ( s.outgoingEdges().size() == 1 )
 			{
-				Link link = s.outgoingEdges().get( 0 );
+				final Link link = s.outgoingEdges().get( 0 );
 				s = link.getTarget( s );
 				if ( s.incomingEdges().size() != 1 )
 					break;
@@ -206,7 +246,7 @@ private void forEachSpotAndLinkOfTheBranch( ModelGraph graph, Spot spot, Consume
 			s.refTo( spot );
 			while ( s.incomingEdges().size() == 1 )
 			{
-				Link link = s.incomingEdges().get( 0 );
+				final Link link = s.incomingEdges().get( 0 );
 				s = link.getSource( s );
 				if ( s.outgoingEdges().size() != 1 )
 					break;
diff --git a/src/main/java/org/mastodon/util/TagSetUtils.java b/src/main/java/org/mastodon/util/TagSetUtils.java
index 2fedeeafa..c8606f377 100644
--- a/src/main/java/org/mastodon/util/TagSetUtils.java
+++ b/src/main/java/org/mastodon/util/TagSetUtils.java
@@ -1,5 +1,9 @@
 package org.mastodon.util;
 
+import java.util.Collection;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
 import org.mastodon.mamut.model.Link;
 import org.mastodon.mamut.model.Model;
 import org.mastodon.mamut.model.ModelGraph;
@@ -8,12 +12,9 @@
 import org.mastodon.model.tag.TagSetModel;
 import org.mastodon.model.tag.TagSetStructure;
 
-import java.util.Collection;
-import java.util.Map;
-import java.util.NoSuchElementException;
-
 /**
- * Collection of utilities related to manipulating {@link org.mastodon.model.tag.TagSetStructure.TagSet}s.
+ * Collection of utilities related to manipulating
+ * {@link org.mastodon.model.tag.TagSetStructure.TagSet}s.
  *
  * @author Matthias Arzt
  * @author Stefan Hahmann
@@ -27,62 +28,80 @@ private TagSetUtils()
 	}
 
 	/**
-	 * Help creating a visible color value by adding
-	 * a (full opacity) alpha channel.
-	 * @param rgbAsBottom24bits The encoded RGB triplet.
-	 * @return The int value of the RGB color, ready to use
-	 *         with {@link org.mastodon.model.tag.TagSetStructure.Tag}.
+	 * Help creating a visible color value by adding a (full opacity) alpha
+	 * channel.
+	 * 
+	 * @param rgbAsBottom24bits
+	 *            The encoded RGB triplet.
+	 * @return The int value of the RGB color, ready to use with
+	 *         {@link org.mastodon.model.tag.TagSetStructure.Tag}.
 	 */
-	public static int rgbToValidColor(final int rgbAsBottom24bits) {
+	public static int rgbToValidColor( final int rgbAsBottom24bits )
+	{
 		return 0xFF000000 | rgbAsBottom24bits;
 	}
 
 	/**
-	 * Help creating a visible color value by adding
-	 * a (full opacity) alpha channel.
-	 * @param r 0-255 valued red channel.
-	 * @param g 0-255 valued green channel.
-	 * @param b 0-255 valued blue channel.
-	 * @return The int value of the RGB color, ready to use
-	 *         with {@link org.mastodon.model.tag.TagSetStructure.Tag}.
+	 * Help creating a visible color value by adding a (full opacity) alpha
+	 * channel.
+	 * 
+	 * @param r
+	 *            0-255 valued red channel.
+	 * @param g
+	 *            0-255 valued green channel.
+	 * @param b
+	 *            0-255 valued blue channel.
+	 * @return The int value of the RGB color, ready to use with
+	 *         {@link org.mastodon.model.tag.TagSetStructure.Tag}.
 	 */
-	public static int rgbToValidColor(final int r, final int g, final int b) {
-		return 0xFF000000 | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF);
+	public static int rgbToValidColor( final int r, final int g, final int b )
+	{
+		return 0xFF000000 | ( ( r & 0xFF ) << 16 ) | ( ( g & 0xFF ) << 8 ) | ( b & 0xFF );
 	}
 
 	/**
 	 * Help creating a fully-described color value.
-	 * @param r 0-255 valued red channel.
-	 * @param g 0-255 valued green channel.
-	 * @param b 0-255 valued blue channel.
-	 * @param alpha 0-255 valued opacity (alpha) channel,
-	 *              0 - fully transparent, 255 - fully opaque.
-	 * @return The int value of the RGB color, ready to use
-	 *         with {@link org.mastodon.model.tag.TagSetStructure.Tag}.
+	 * 
+	 * @param r
+	 *            0-255 valued red channel.
+	 * @param g
+	 *            0-255 valued green channel.
+	 * @param b
+	 *            0-255 valued blue channel.
+	 * @param alpha
+	 *            0-255 valued opacity (alpha) channel, 0 - fully transparent,
+	 *            255 - fully opaque.
+	 * @return The int value of the RGB color, ready to use with
+	 *         {@link org.mastodon.model.tag.TagSetStructure.Tag}.
 	 */
-	public static int rgbaToValidColor(final int r, final int g, final int b, final int alpha) {
-		return ((alpha & 0xFF) << 24) | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF);
+	public static int rgbaToValidColor( final int r, final int g, final int b, final int alpha )
+	{
+		return ( ( alpha & 0xFF ) << 24 ) | ( ( r & 0xFF ) << 16 ) | ( ( g & 0xFF ) << 8 ) | ( b & 0xFF );
 	}
 
 	/**
-	 * Add a new tag set to the given model. The color values could be created, e.g.,
-	 * with the {@link TagSetUtils#rgbToValidColor(int, int, int)}.
-	 * @param model The model that will contain the new tag set.
-	 * @param name The name of the new tag set.
-	 * @param tagsAndColors The list of labels and colors for the new tags. This
-	 *            could be a {@link Map#entrySet()} or a list of
+	 * Add a new tag set to the given model. The color values could be created,
+	 * e.g., with the {@link TagSetUtils#rgbToValidColor(int, int, int)}.
+	 * 
+	 * @param model
+	 *            The model that will contain the new tag set.
+	 * @param name
+	 *            The name of the new tag set.
+	 * @param tagsAndColors
+	 *            The list of labels and colors for the new tags. This could be
+	 *            a {@link Map#entrySet()} or a list of
 	 *            {@link org.apache.commons.lang3.tuple.Pair}s.
 	 * @return The new tag set.
 	 */
-	public static TagSetStructure.TagSet addNewTagSetToModel( Model model, String name,
-			Collection< ? extends Map.Entry< String, Integer > > tagsAndColors )
+	public static TagSetStructure.TagSet addNewTagSetToModel( final Model model, final String name,
+			final Collection< ? extends Map.Entry< String, Integer > > tagsAndColors )
 	{
-		TagSetModel< Spot, Link > tagSetModel = model.getTagSetModel();
-		TagSetStructure original = tagSetModel.getTagSetStructure();
-		TagSetStructure replacement = new TagSetStructure();
+		final TagSetModel< Spot, Link > tagSetModel = model.getTagSetModel();
+		final TagSetStructure original = tagSetModel.getTagSetStructure();
+		final TagSetStructure replacement = new TagSetStructure();
 		replacement.set( original );
-		TagSetStructure.TagSet newTagSet = replacement.createTagSet( name );
-		for ( Map.Entry< String, Integer > tag : tagsAndColors )
+		final TagSetStructure.TagSet newTagSet = replacement.createTagSet( name );
+		for ( final Map.Entry< String, Integer > tag : tagsAndColors )
 			newTagSet.createTag( tag.getKey(), tag.getValue() );
 		tagSetModel.setTagSetStructure( replacement );
 		return newTagSet;
@@ -90,25 +109,54 @@ public static TagSetStructure.TagSet addNewTagSetToModel( Model model, String na
 
 	/**
 	 * Assigns the specified {@code tag} to the given {@code spot}.
+	 * 
+	 * @param model
+	 *            the model to get the tag-set model from.
+	 * @param tagSet
+	 *            the tag-set.
+	 * @param tag
+	 *            the tag in the tag-set.
+	 * @param spot
+	 *            the spot.
 	 */
-	public static void tagSpot( Model model, TagSetStructure.TagSet tagSet, TagSetStructure.Tag tag, Spot spot )
+	public static void tagSpot( final Model model, final TagSetStructure.TagSet tagSet, final TagSetStructure.Tag tag, final Spot spot )
 	{
 		model.getTagSetModel().getVertexTags().tags( tagSet ).set( spot, tag );
 	}
 
 	/**
-	 * Assigns the specified {@code tag} to the given {@code spot} and all of its outgoing edges.
+	 * Assigns the specified {@code tag} to the given {@code spot} and all of
+	 * its outgoing edges.
+	 * 
+	 * @param model
+	 *            the model to get the tag-set model from.
+	 * @param tagSet
+	 *            the tag-set.
+	 * @param tag
+	 *            the tag in the tag-set.
+	 * @param spot
+	 *            the spot.
 	 */
-	public static void tagSpotAndOutgoingEdges( Model model, TagSetStructure.TagSet tagSet, TagSetStructure.Tag tag, Spot spot )
+	public static void tagSpotAndOutgoingEdges( final Model model, final TagSetStructure.TagSet tagSet, final TagSetStructure.Tag tag, final Spot spot )
 	{
 		tagSpot( model, tagSet, tag, spot );
 		tagLinks( model, tagSet, tag, spot.outgoingEdges() );
 	}
 
 	/**
-	 * Assigns the specified {@code tag} to the given {@code spot} and all of its incoming edges.
+	 * Assigns the specified {@code tag} to the given {@code spot} and all of
+	 * its incoming edges.
+	 * 
+	 * @param model
+	 *            the model to get the tag-set model from.
+	 * @param tagSet
+	 *            the tag-set.
+	 * @param tag
+	 *            the tag in the tag-set.
+	 * @param spot
+	 *            the spot.
 	 */
-	public static void tagSpotAndIncomingEdges( Model model, Spot spot, TagSetStructure.TagSet tagSet, TagSetStructure.Tag tag )
+	public static void tagSpotAndIncomingEdges( final Model model, final Spot spot, final TagSetStructure.TagSet tagSet, final TagSetStructure.Tag tag )
 	{
 		tagSpot( model, tagSet, tag, spot );
 		tagLinks( model, tagSet, tag, spot.incomingEdges() );
@@ -116,47 +164,71 @@ public static void tagSpotAndIncomingEdges( Model model, Spot spot, TagSetStruct
 
 	/**
 	 * Assigns the specified {@code tag} to the given {@code spots}.
+	 * 
+	 * @param model
+	 *            the model to get the tag-set model from.
+	 * @param tagSet
+	 *            the tag-set.
+	 * @param tag
+	 *            the tag in the tag-set.
+	 * @param spots
+	 *            the spots.
 	 */
-	public static void tagSpots( Model model, TagSetStructure.TagSet tagSet, TagSetStructure.Tag tag, Iterable< Spot > spots )
+	public static void tagSpots( final Model model, final TagSetStructure.TagSet tagSet, final TagSetStructure.Tag tag, final Iterable< Spot > spots )
 	{
-		ObjTagMap< Spot, TagSetStructure.Tag > vertexTags = model.getTagSetModel().getVertexTags().tags( tagSet );
-		for ( Spot spot : spots )
+		final ObjTagMap< Spot, TagSetStructure.Tag > vertexTags = model.getTagSetModel().getVertexTags().tags( tagSet );
+		for ( final Spot spot : spots )
 			vertexTags.set( spot, tag );
 	}
 
 	/**
 	 * Assigns the specified {@code tag} to the given {@code links}.
+	 * 
+	 * @param model
+	 *            the model to get the tag-set model from.
+	 * @param tagSet
+	 *            the tag-set.
+	 * @param tag
+	 *            the tag in the tag-set.
+	 * @param links
+	 *            the links.
 	 */
-	public static void tagLinks( Model model, TagSetStructure.TagSet tagSet, TagSetStructure.Tag tag, Iterable< Link > links )
+	public static void tagLinks( final Model model, final TagSetStructure.TagSet tagSet, final TagSetStructure.Tag tag, final Iterable< Link > links )
 	{
-		ObjTagMap< Link, TagSetStructure.Tag > edgeTags = model.getTagSetModel().getEdgeTags().tags( tagSet );
-		for ( Link link : links )
+		final ObjTagMap< Link, TagSetStructure.Tag > edgeTags = model.getTagSetModel().getEdgeTags().tags( tagSet );
+		for ( final Link link : links )
 			edgeTags.set( link, tag );
 	}
 
 	/**
-	 * Assigns the specified tag to all tags and spots that belong to the same branch as the given spot.
-	 * @param model Model that contains the graph and the tag data structures.
-	 * @param tagSet The {@link TagSetStructure.TagSet} the tag belongs to.
-	 * @param tag The tag to assign to the branch.
-	 * @param spot The spot, that specifies the branch to be tagged.
-	 *             Doesn't need to be the branch start or branch end.
-	 *             It can be any spot on the branch.
+	 * Assigns the specified tag to all tags and spots that belong to the same
+	 * branch as the given spot.
+	 * 
+	 * @param model
+	 *            Model that contains the graph and the tag data structures.
+	 * @param tagSet
+	 *            The {@link TagSetStructure.TagSet} the tag belongs to.
+	 * @param tag
+	 *            The tag to assign to the branch.
+	 * @param spot
+	 *            The spot, that specifies the branch to be tagged. Doesn't need
+	 *            to be the branch start or branch end. It can be any spot on
+	 *            the branch.
 	 */
-	public static void tagBranch( Model model, TagSetStructure.TagSet tagSet, TagSetStructure.Tag tag, Spot spot )
+	public static void tagBranch( final Model model, final TagSetStructure.TagSet tagSet, final TagSetStructure.Tag tag, final Spot spot )
 	{
-		ModelGraph graphA = model.getGraph();
+		final ModelGraph graphA = model.getGraph();
 		Spot s = graphA.vertexRef();
 		try
 		{
-			ObjTagMap< Spot, TagSetStructure.Tag > vertexTags = model.getTagSetModel().getVertexTags().tags( tagSet );
-			ObjTagMap< Link, TagSetStructure.Tag > edgeTags = model.getTagSetModel().getEdgeTags().tags( tagSet );
+			final ObjTagMap< Spot, TagSetStructure.Tag > vertexTags = model.getTagSetModel().getVertexTags().tags( tagSet );
+			final ObjTagMap< Link, TagSetStructure.Tag > edgeTags = model.getTagSetModel().getEdgeTags().tags( tagSet );
 			vertexTags.set( spot, tag );
-			//forward
+			// forward
 			s.refTo( spot );
 			while ( s.outgoingEdges().size() == 1 )
 			{
-				Link link = s.outgoingEdges().get( 0 );
+				final Link link = s.outgoingEdges().get( 0 );
 				s = link.getTarget( s );
 				if ( s.incomingEdges().size() != 1 )
 					break;
@@ -167,7 +239,7 @@ public static void tagBranch( Model model, TagSetStructure.TagSet tagSet, TagSet
 			s.refTo( spot );
 			while ( s.incomingEdges().size() == 1 )
 			{
-				Link link = s.incomingEdges().get( 0 );
+				final Link link = s.incomingEdges().get( 0 );
 				s = link.getSource( s );
 				if ( s.outgoingEdges().size() != 1 )
 					break;
@@ -182,28 +254,33 @@ public static void tagBranch( Model model, TagSetStructure.TagSet tagSet, TagSet
 	}
 
 	/**
-	 * If all spots and links of the branch have the same tag, return that tag, return null otherwise.
-	 * @param model The model that contains the graph and the tags.
-	 * @param tagSet The tag set to consider.
-	 * @param branchStart The spot at the start of the branch.
+	 * If all spots and links of the branch have the same tag, return that tag,
+	 * return null otherwise.
+	 * 
+	 * @param model
+	 *            The model that contains the graph and the tags.
+	 * @param tagSet
+	 *            The tag set to consider.
+	 * @param branchStart
+	 *            The spot at the start of the branch.
 	 * @return the tag or null.
 	 */
-	public static TagSetStructure.Tag getBranchTag( Model model, TagSetStructure.TagSet tagSet, Spot branchStart )
+	public static TagSetStructure.Tag getBranchTag( final Model model, final TagSetStructure.TagSet tagSet, final Spot branchStart )
 	{
-		ModelGraph graphA = model.getGraph();
+		final ModelGraph graphA = model.getGraph();
 		Spot s = graphA.vertexRef();
 		try
 		{
-			ObjTagMap< Spot, TagSetStructure.Tag > vertexTags = model.getTagSetModel().getVertexTags().tags( tagSet );
-			ObjTagMap< Link, TagSetStructure.Tag > edgeTags = model.getTagSetModel().getEdgeTags().tags( tagSet );
-			TagSetStructure.Tag tag = vertexTags.get( branchStart );
+			final ObjTagMap< Spot, TagSetStructure.Tag > vertexTags = model.getTagSetModel().getVertexTags().tags( tagSet );
+			final ObjTagMap< Link, TagSetStructure.Tag > edgeTags = model.getTagSetModel().getEdgeTags().tags( tagSet );
+			final TagSetStructure.Tag tag = vertexTags.get( branchStart );
 			if ( tag == null )
 				return null;
-			//forward
+			// forward
 			s.refTo( branchStart );
 			while ( s.outgoingEdges().size() == 1 )
 			{
-				Link link = s.outgoingEdges().get( 0 );
+				final Link link = s.outgoingEdges().get( 0 );
 				s = link.getTarget( s );
 				if ( s.incomingEdges().size() != 1 )
 					break;
@@ -221,20 +298,27 @@ public static TagSetStructure.Tag getBranchTag( Model model, TagSetStructure.Tag
 	}
 
 	/**
-	 * @return the first tag set that matches the given name.
-	 * @throws NoSuchElementException if the tagset was not found.
+	 * Returns the first tag-set that matches the given name.
+	 * 
+	 * @param model
+	 *            the model to get the tag-set model from.
+	 * @param name
+	 *            the name to search for.
+	 * @return the tag-set.
+	 * @throws NoSuchElementException
+	 *             if the tag-set was not found.
 	 */
-	public static TagSetStructure.TagSet findTagSet( Model model, String name )
+	public static TagSetStructure.TagSet findTagSet( final Model model, final String name )
 	{
-		for ( TagSetStructure.TagSet tagSet : model.getTagSetModel().getTagSetStructure().getTagSets() )
+		for ( final TagSetStructure.TagSet tagSet : model.getTagSetModel().getTagSetStructure().getTagSets() )
 			if ( name.equals( tagSet.getName() ) )
 				return tagSet;
 		throw new NoSuchElementException( "Did not find a tag set with the given name: " + name );
 	}
 
-	public static TagSetStructure.Tag findTag( TagSetStructure.TagSet tagSet, String tagLabel )
+	public static TagSetStructure.Tag findTag( final TagSetStructure.TagSet tagSet, final String tagLabel )
 	{
-		for ( TagSetStructure.Tag tag : tagSet.getTags() )
+		for ( final TagSetStructure.Tag tag : tagSet.getTags() )
 			if ( tagLabel.equals( tag.label() ) )
 				return tag;
 		throw new NoSuchElementException( "Did not find a tag with the given label: " + tagLabel );
diff --git a/src/main/java/org/mastodon/util/TreeUtils.java b/src/main/java/org/mastodon/util/TreeUtils.java
index 3d20e1c82..fe04bd6fb 100644
--- a/src/main/java/org/mastodon/util/TreeUtils.java
+++ b/src/main/java/org/mastodon/util/TreeUtils.java
@@ -20,11 +20,12 @@ private TreeUtils()
 
 	/**
 	 * This method finds a subset of the given {@code selectedVertices} that
-	 * contains only the roots of the subtrees that are selected. The order
-	 * of the returned list follows the order of the {@code roots} list and
-	 * the order of the outgoing edges of the graphs vertices.
+	 * contains only the roots of the subtrees that are selected. The order of
+	 * the returned list follows the order of the {@code roots} list and the
+	 * order of the outgoing edges of the graphs vertices.
 	 * 

* Example {@code graph}: + * *

 	 *   A                B
 	 *  / \             /   \
@@ -35,8 +36,20 @@ private TreeUtils()
 	 *   a4 a5
 	 * 
* - * If {@code selectedVertices} contains: {@code {a2, a4, a5, b1, b3, b4, b6}}, - * then the returned list will be: {@code [a2, b1, b6]}. + * If {@code selectedVertices} contains: {@code {a2, a4, a5, b1, b3, b4, + * b6}}, then the returned list will be: {@code [a2, b1, b6]}. + * + * @param + * the type vertices in the graph. + * @param graph + * the graph. + * @param roots + * the roots of the graph, that is vertices with no incoming + * edges. + * @param selectedVertices + * the selected vertices. + * @return the subset of selected vertices that contains only the roots of + * the subtrees. */ public static < V extends Vertex< ? > > RefList< V > findSelectedSubtreeRoots( final Graph< V, ? > graph, @@ -61,12 +74,12 @@ private TreeUtils() return selectedSubtreeRoots; } - private static < V extends Vertex< ? > > boolean ensureNoLoop( DepthFirstIteration.Step< V > step, RefSet< V > visitedNodes ) + private static < V extends Vertex< ? > > boolean ensureNoLoop( final DepthFirstIteration.Step< V > step, final RefSet< V > visitedNodes ) { if ( !step.isFirstVisit() ) return true; - boolean isLoop = !visitedNodes.add( step.node() ); // The depth first iteration enters a node for the second time. -> there's a loop. + final boolean isLoop = !visitedNodes.add( step.node() ); // The depth first iteration enters a node for the second time. -> there's a loop. if ( isLoop ) step.truncate(); // Break the loop by not visiting the child nodes. @@ -78,6 +91,7 @@ private TreeUtils() * that contain any of the given {@code nodes}. *

* Example: + * *

 	 *   A                B      C
 	 *  / \             /   \  /
@@ -93,22 +107,42 @@ private TreeUtils()
 	 * 

* If {@code nodes} contains {@code {a2, a4, b4}} then the method will * return {@code {A, B, C}}. + * + * @param + * the type of vertices in the graph. + * @param + * the type of edges in the graph. + * @param graph + * the graph. + * @param nodes + * the nodes. + * @return the filtered roots. */ - public static , E extends Edge< V > > RefSet< V > findRootsOfTheGivenNodes( Graph< V, E > graph, Collection< V > nodes ) + public static , E extends Edge< V > > RefSet< V > findRootsOfTheGivenNodes( final Graph< V, E > graph, final Collection< V > nodes ) { return filterRoots( graph, findAllConnectedNodes( graph, nodes ) ); } /** - * @return the set of predecessors of the given {@code nodes}. Please note + * Returns the set of predecessors of the given {@code nodes}. Please note * that returned set also contains all the given {@code nodes}. + * + * @param + * the type of vertices in the graph. + * @param + * the type of edges in the graph. + * @param graph + * the graph. + * @param nodes + * the nodes. + * @return the set of predecessors. */ - private static < V extends Vertex, E extends Edge< V > > RefSet< V > findAllConnectedNodes( Graph< V, E > graph, Collection< V > nodes ) + private static < V extends Vertex, E extends Edge< V > > RefSet< V > findAllConnectedNodes( final Graph< V, E > graph, final Collection< V > nodes ) { // The following code performs an inverse depth first search starting // from the given nodes. The set of visited nodes is returned. - V ref = graph.vertexRef(); - V ref2 = graph.vertexRef(); + final V ref = graph.vertexRef(); + final V ref2 = graph.vertexRef(); try { final RefSet< V > visited = RefCollections.createRefSet( graph.vertices() ); @@ -116,13 +150,13 @@ private static < V extends Vertex, E extends Edge< V > > RefSet< V > findAllC final RefStack< V > stack = RefCollections.createRefStack( graph.vertices() ); stack.addAll( visited ); while ( ! stack.isEmpty() ) { - V node = stack.pop( ref ); - for ( E edge : node.incomingEdges() ) { - V parentNode = edge.getSource( ref2 ); + final V node = stack.pop( ref ); + for ( final E edge : node.incomingEdges() ) { + final V parentNode = edge.getSource( ref2 ); addNode( visited, stack, parentNode ); } - for ( E edge : node.outgoingEdges() ) { - V childNode = edge.getTarget( ref2 ); + for ( final E edge : node.outgoingEdges() ) { + final V childNode = edge.getTarget( ref2 ); addNode( visited, stack, childNode ); } } @@ -135,22 +169,32 @@ private static < V extends Vertex, E extends Edge< V > > RefSet< V > findAllC } } - private static < V extends Vertex, E extends Edge< V > > void addNode( RefSet< V > visited, RefStack< V > stack, V parentNode ) + private static < V extends Vertex, E extends Edge< V > > void addNode( final RefSet< V > visited, final RefStack< V > stack, final V parentNode ) { - boolean firstVisit = visited.add( parentNode ); + final boolean firstVisit = visited.add( parentNode ); if ( firstVisit ) stack.add( parentNode ); } /** - * @return a subset of the given {@code nodes} that contains only those + * Returns a subset of the given {@code nodes} that contains only those * nodes that are roots of the {@code graph}. (A note is considered a root * if it has no incoming edges.) + * + * @param + * the type of vertices in the graph. + * @param + * the type of edges in the graph. + * @param graph + * the graph. + * @param nodes + * the nodes. + * @return a subset of the nodes. */ - private static < V extends Vertex, E extends Edge< V > > RefSet< V > filterRoots( Graph< V, E > graph, Collection< V > nodes ) + private static < V extends Vertex, E extends Edge< V > > RefSet< V > filterRoots( final Graph< V, E > graph, final Collection< V > nodes ) { final RefSet< V > roots = RefCollections.createRefSet( graph.vertices() ); - for ( V node : nodes ) + for ( final V node : nodes ) if ( node.incomingEdges().isEmpty() ) roots.add( node ); return roots; diff --git a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java index 886c0131d..20fa2d7a3 100644 --- a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java +++ b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java @@ -432,7 +432,11 @@ public static SharedBigDataViewerData fromDummyFilename( final String spimDataXm * BigDataViewer XML. The actual image data is not loaded, all pixels are * black. * + * @param spimDataXmlFilename + * the pseudo XML file, containing the dummy information. * @return a "dummy" {@link SharedBigDataViewerData} object. + * @throws SpimDataException + * if something wrong happens when build the spim data object. */ public static SharedBigDataViewerData createDummyDataFromSpimDataXml( final String spimDataXmlFilename ) throws SpimDataException { diff --git a/src/main/java/org/mastodon/views/bdv/overlay/OverlayGraphRenderer.java b/src/main/java/org/mastodon/views/bdv/overlay/OverlayGraphRenderer.java index d639b3418..450758eea 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/OverlayGraphRenderer.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/OverlayGraphRenderer.java @@ -182,10 +182,16 @@ public Visibilities< V, E > getVisibilities() public static final double pointRadius = 2.5; /** - * Return signed distance of p to z=0 plane, truncated at cutoff and scaled - * by 1/cutoff. A point on the plane has d=0. A Point that is at cutoff or - * farther behind the plane has d=1. A point that is at -cutoff or more in - * front of the plane has d=-1. + * Return signed distance of p to a plane along Z, truncated at cutoff and + * scaled by 1/cutoff. A point on the plane has d=0. A Point that is at + * cutoff or farther behind the plane has d=1. A point that is at -cutoff or + * more in front of the plane has d=-1. + * + * @param z + * the position of the plane. + * @param cutoff + * the cutoff. + * @return the signed distance. */ protected static double sliceDistance( final double z, final double cutoff ) { @@ -197,8 +203,16 @@ protected static double sliceDistance( final double z, final double cutoff ) /** * Return signed distance of timepoint t to t0, truncated at cutoff and - * scaled by 1/cutoff. t=t0 has d=0. t≤t0-cutoff has d=-1. - * t≥t0+cutoff has d=1. + * scaled by 1/cutoff. t=t0 has d=0. t≤t0-cutoff has d=-1. t≥t0+cutoff + * has d=1. + * + * @param t + * the timepoint. + * @param t0 + * the target timepoint. + * @param cutoff + * the cutoff. + * @return the signed distance. */ private static double timeDistance( final double t, final double t0, final double cutoff ) { @@ -250,7 +264,16 @@ private static int truncRGBA( final double r, final double g, final double b, fi * (alpha value decreases). * @param isSelected * whether to use selected or un-selected color scheme. - * @param color the color assigned to the object when using a coloring scheme. + * @param color + * the color assigned to the object when using a coloring scheme. + * @param isHighlighted + * whether the object is highlighted. + * @param colorSpot + * the default color to paint the spot. + * @param colorPast + * the color used to paint objects that are in the past. + * @param colorFuture + * the color used to paint objects that are in the future. * @return vertex/edge color suitable for display in a BDV. */ protected static Color getColor( @@ -400,8 +423,10 @@ protected AffineTransform3D getRenderTransformCopy() * center of every ellipsoid that intersects the visible volume. * * @param transform + * the current view transform. * @param timepoint - * @return + * the current timepoint. + * @return a convex polytope object. */ protected ConvexPolytope getVisiblePolytopeGlobal( final AffineTransform3D transform, diff --git a/src/main/java/org/mastodon/views/grapher/datagraph/DataGraphLayout.java b/src/main/java/org/mastodon/views/grapher/datagraph/DataGraphLayout.java index 934f844f7..aaa22b56a 100644 --- a/src/main/java/org/mastodon/views/grapher/datagraph/DataGraphLayout.java +++ b/src/main/java/org/mastodon/views/grapher/datagraph/DataGraphLayout.java @@ -249,11 +249,13 @@ private void notifyListeners() } /** + * Returns the closest active vertex from the specified coordinate. * * @param centerPos - * in screen coordinates. + * the coordinate, in screen coordinates. * @param ref - * @return + * a ref to a vertex object. + * @return the closest vertex, or null if it cannot be found. */ public DataVertex getClosestActiveVertex( final RealPoint centerPos, final DataVertex ref ) { @@ -493,11 +495,18 @@ public void cropAndScale( screenKDtree = KDTree.kdtree( screenVertices, screenVertexPool ); } + /** + * Interface for listeners that are notified when the layout of the data + * graph has changed. + */ public interface LayoutListener { /** - * Notifies after the layout has been done. + * Notified after the layout has been done. + * + * @param layout + * the layout. */ public void layoutChanged( final DataGraphLayout< ?, ? > layout ); } diff --git a/src/main/java/org/mastodon/views/table/TableViewFrameBuilder.java b/src/main/java/org/mastodon/views/table/TableViewFrameBuilder.java index a4cf9a063..b177b8395 100644 --- a/src/main/java/org/mastodon/views/table/TableViewFrameBuilder.java +++ b/src/main/java/org/mastodon/views/table/TableViewFrameBuilder.java @@ -693,6 +693,7 @@ public GraphTableBuilder< V, E > navigationHandler( final NavigationHandler< V, * @param selectionTable * if true will display the content of the * {@link #selectionModel}. + * @return this builder. */ public GraphTableBuilder< V, E > selectionTable( final boolean selectionTable ) { diff --git a/src/test/java/org/mastodon/StartMastodonOnProject.java b/src/test/java/org/mastodon/StartMastodonOnProject.java index 35d438cae..96fed9b24 100644 --- a/src/test/java/org/mastodon/StartMastodonOnProject.java +++ b/src/test/java/org/mastodon/StartMastodonOnProject.java @@ -38,7 +38,6 @@ import org.mastodon.mamut.MainWindow; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.ProjectLoader; -import org.mastodon.mamut.io.project.MamutProjectIO; import org.scijava.Context; import mpicbg.spim.data.SpimDataException; @@ -62,7 +61,7 @@ public static void launch( final String projectPath ) try { System.setProperty( "apple.laf.useScreenMenuBar", "true" ); - final ProjectModel appModel = ProjectLoader.open( MamutProjectIO.load( projectPath ), new Context() ); + final ProjectModel appModel = ProjectLoader.open( projectPath, new Context() ); final MainWindow win = new MainWindow( appModel ); win.setVisible( true ); win.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); From 7f7422f836b21fe39d8d1af9c8572ebe0e4f78af Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 25 Aug 2023 13:57:05 +0200 Subject: [PATCH 071/220] Remove superficious type in the FocusModel. The FocusModel interface had an unneeded type. It does not need to know the type of edges in a graph, because it does not work with a graph, but with a simple collection. Removing this superficious type triggered a lot of changes in the code because we touched the signature of a core interface. But not impact otherwise. --- .../org/mastodon/adapter/FocusModelAdapter.java | 13 ++++--------- .../java/org/mastodon/app/MastodonAppModel.java | 4 ++-- src/main/java/org/mastodon/app/MastodonView.java | 2 +- .../java/org/mastodon/app/ui/SearchVertexLabel.java | 8 ++++---- .../org/mastodon/mamut/views/MamutBranchView.java | 4 ++-- .../org/mastodon/mamut/views/bdv/MamutViewBdv.java | 2 +- .../mastodon/mamut/views/table/MamutViewTable.java | 6 +++--- .../trackscheme/MamutBranchViewTrackScheme.java | 2 +- .../MamutBranchViewTrackSchemeHierarchy.java | 2 +- .../org/mastodon/model/AutoNavigateFocusModel.java | 8 ++++---- .../java/org/mastodon/model/DefaultFocusModel.java | 2 +- src/main/java/org/mastodon/model/FocusModel.java | 6 +----- .../model/branch/BranchGraphFocusAdapter.java | 6 +++--- src/main/java/org/mastodon/ui/FocusActions.java | 6 +++--- .../views/bdv/overlay/BdvSelectionBehaviours.java | 8 ++++---- .../mastodon/views/bdv/overlay/EditBehaviours.java | 8 ++++---- .../views/bdv/overlay/EditSpecialBehaviours.java | 8 ++++---- .../bdv/overlay/OverlayBranchGraphRenderer.java | 2 +- .../views/bdv/overlay/OverlayGraphRenderer.java | 4 ++-- .../mastodon/views/bdv/overlay/Visibilities.java | 8 ++++---- .../views/bdv/overlay/ui/DummyBdvPanel.java | 2 +- .../views/grapher/display/DataDisplayAutoFocus.java | 7 +++---- .../views/grapher/display/DataDisplayFrame.java | 2 +- .../display/DataDisplayNavigationActions.java | 6 +++--- .../display/DataDisplayNavigationBehaviours.java | 6 +++--- .../views/grapher/display/DataDisplayOverlay.java | 6 +++--- .../views/grapher/display/DataDisplayPanel.java | 2 +- .../display/style/DataDisplayStyleEditorPanel.java | 2 +- .../mastodon/views/table/TableViewFrameBuilder.java | 6 +++--- .../display/BranchTrackSchemeEditLabelAction.java | 5 ++--- .../display/EditFocusVertexLabelAction.java | 7 +++---- .../trackscheme/display/TrackSchemeAutoFocus.java | 9 ++++----- .../views/trackscheme/display/TrackSchemeFrame.java | 2 +- .../display/TrackSchemeNavigationActions.java | 6 +++--- .../display/TrackSchemeNavigationBehaviours.java | 6 +++--- .../trackscheme/display/TrackSchemeOverlay.java | 9 +++++---- .../views/trackscheme/display/TrackSchemePanel.java | 4 ++-- .../display/style/TrackSchemeStyleEditorPanel.java | 3 +-- src/test/java/org/mastodon/util/MastodonUtils.java | 2 +- 39 files changed, 94 insertions(+), 107 deletions(-) diff --git a/src/main/java/org/mastodon/adapter/FocusModelAdapter.java b/src/main/java/org/mastodon/adapter/FocusModelAdapter.java index 42d7d54ce..53f7514fd 100644 --- a/src/main/java/org/mastodon/adapter/FocusModelAdapter.java +++ b/src/main/java/org/mastodon/adapter/FocusModelAdapter.java @@ -40,27 +40,22 @@ * * @param * vertex type of source graph. - * @param - * edge type of source graph. * @param * vertex type of this wrapped {@link FocusModel}. - * @param - * edge type of this wrapped {@link FocusModel}. * * @author Tobias Pietzsch */ -public class FocusModelAdapter< V extends Vertex< E >, E extends Edge< V >, WV extends Vertex< WE >, - WE extends Edge< WV > > - implements FocusModel< WV, WE > +public class FocusModelAdapter< V extends Vertex< ? >, E extends Edge< V >, WV extends Vertex< WE >, WE extends Edge< WV > > + implements FocusModel< WV > { - private final FocusModel< V, E > focus; + private final FocusModel< V > focus; private final RefBimap< V, WV > vertexMap; private final ForwardedListeners< FocusListener > listeners; public FocusModelAdapter( - final FocusModel< V, E > focus, + final FocusModel< V > focus, final RefBimap< V, WV > vertexMap, final RefBimap< E, WE > edgeMap ) { diff --git a/src/main/java/org/mastodon/app/MastodonAppModel.java b/src/main/java/org/mastodon/app/MastodonAppModel.java index 4a1e3d308..4a4c9c6c5 100644 --- a/src/main/java/org/mastodon/app/MastodonAppModel.java +++ b/src/main/java/org/mastodon/app/MastodonAppModel.java @@ -82,7 +82,7 @@ public class MastodonAppModel< private final HighlightModel< V, E > highlightModel; - private final FocusModel< V, E > focusModel; + private final FocusModel< V > focusModel; private final GroupManager groupManager; @@ -179,7 +179,7 @@ public HighlightModel< V, E > getHighlightModel() return highlightModel; } - public FocusModel< V, E > getFocusModel() + public FocusModel< V > getFocusModel() { return focusModel; } diff --git a/src/main/java/org/mastodon/app/MastodonView.java b/src/main/java/org/mastodon/app/MastodonView.java index 8f92b5c24..c203120df 100644 --- a/src/main/java/org/mastodon/app/MastodonView.java +++ b/src/main/java/org/mastodon/app/MastodonView.java @@ -85,7 +85,7 @@ public class MastodonView< protected final HighlightModel< V, E > highlightModel; - protected final FocusModel< V, E > focusModel; + protected final FocusModel< V > focusModel; protected final SelectionModel< V, E > selectionModel; diff --git a/src/main/java/org/mastodon/app/ui/SearchVertexLabel.java b/src/main/java/org/mastodon/app/ui/SearchVertexLabel.java index d9c36f04f..11bada022 100644 --- a/src/main/java/org/mastodon/app/ui/SearchVertexLabel.java +++ b/src/main/java/org/mastodon/app/ui/SearchVertexLabel.java @@ -140,7 +140,7 @@ public class SearchVertexLabel< V extends Vertex< E > & HasLabel & Ref< V >, E e final ReadOnlyGraph< V, E > graph, final NavigationHandler< V, E > navigation, final SelectionModel< V, E > selection, - final FocusModel< V, E > focus, + final FocusModel< V > focus, final JComponent cancelEntryFocusTarget ) { final SearchVertexLabel< V, E > search = @@ -175,7 +175,7 @@ private SearchVertexLabel( final ReadOnlyGraph< V, E > graph, final NavigationHandler< V, E > navigation, final SelectionModel< V, E > selection, - final FocusModel< V, E > focus, + final FocusModel< V > focus, final JComponent cancelFocusTarget ) { searchPanel = new JPanel(); @@ -292,7 +292,7 @@ private static class SearchAction< V extends Vertex< E > & HasLabel & Ref< V >, private final NavigationHandler< V, E > navigation; - private final FocusModel< V, E > focus; + private final FocusModel< V > focus; private final SelectionModel< V, E > selection; @@ -308,7 +308,7 @@ public SearchAction( final ReadOnlyGraph< V, E > graph, final NavigationHandler< V, E > navigation, final SelectionModel< V, E > selection, - final FocusModel< V, E > focus ) + final FocusModel< V > focus ) { super( graph ); this.navigation = navigation; diff --git a/src/main/java/org/mastodon/mamut/views/MamutBranchView.java b/src/main/java/org/mastodon/mamut/views/MamutBranchView.java index 40249839c..795e52e0d 100644 --- a/src/main/java/org/mastodon/mamut/views/MamutBranchView.java +++ b/src/main/java/org/mastodon/mamut/views/MamutBranchView.java @@ -166,8 +166,8 @@ public MamutBranchView( final ProjectModel appModel, final VG viewGraph, final S this.highlightModel = new HighlightModelAdapter<>( branchHighlightModel, vertexMap, edgeMap ); // Focus - final FocusModel< Spot, Link > graphFocusModel = appModel.getFocusModel(); - final FocusModel< BranchSpot, BranchLink > branchFocusfocusModel = + final FocusModel< Spot > graphFocusModel = appModel.getFocusModel(); + final FocusModel< BranchSpot > branchFocusfocusModel = new BranchGraphFocusAdapter<>( branchGraph, graph, graph.getGraphIdBimap(), graphFocusModel ); this.focusModel = new FocusModelAdapter<>( branchFocusfocusModel, vertexMap, edgeMap ); diff --git a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdv.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdv.java index b8a48b4c2..b15f6d3ca 100644 --- a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdv.java +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdv.java @@ -304,7 +304,7 @@ public MamutViewBdv( final ProjectModel appModel ) final OverlayGraphWrapper< Spot, Link > viewGraph, final HighlightModel< OverlayVertexWrapper< Spot, Link >, OverlayEdgeWrapper< Spot, Link > > highlightModel, - final FocusModel< OverlayVertexWrapper< Spot, Link >, OverlayEdgeWrapper< Spot, Link > > focusModel, + final FocusModel< OverlayVertexWrapper< Spot, Link > > focusModel, final SelectionModel< OverlayVertexWrapper< Spot, Link >, OverlayEdgeWrapper< Spot, Link > > selectionModel, final GraphColorGenerator< OverlayVertexWrapper< Spot, Link >, diff --git a/src/main/java/org/mastodon/mamut/views/table/MamutViewTable.java b/src/main/java/org/mastodon/mamut/views/table/MamutViewTable.java index d45419621..c61bd46c8 100644 --- a/src/main/java/org/mastodon/mamut/views/table/MamutViewTable.java +++ b/src/main/java/org/mastodon/mamut/views/table/MamutViewTable.java @@ -297,12 +297,12 @@ private static HighlightModel< BranchSpot, BranchLink > branchHighlightModel( fi return branchHighlightModel; } - private static FocusModel< BranchSpot, BranchLink > branchFocusfocusModel( final ProjectModel appModel ) + private static FocusModel< BranchSpot > branchFocusfocusModel( final ProjectModel appModel ) { final ModelGraph graph = appModel.getModel().getGraph(); final ModelBranchGraph branchGraph = appModel.getModel().getBranchGraph(); - final FocusModel< Spot, Link > graphFocusModel = appModel.getFocusModel(); - final FocusModel< BranchSpot, BranchLink > branchFocusfocusModel = + final FocusModel< Spot > graphFocusModel = appModel.getFocusModel(); + final FocusModel< BranchSpot > branchFocusfocusModel = new BranchGraphFocusAdapter<>( branchGraph, graph, graph.getGraphIdBimap(), graphFocusModel ); return branchFocusfocusModel; } diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java index a7b12251f..9d447cf31 100644 --- a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java @@ -301,7 +301,7 @@ public static class BranchTrackSchemeOverlayFactory extends TrackSchemeOverlayFa public TrackSchemeOverlay create( final TrackSchemeGraph< ?, ? > graph, final HighlightModel< TrackSchemeVertex, TrackSchemeEdge > highlight, - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus, + final FocusModel< TrackSchemeVertex > focus, final TrackSchemeOptions options ) { return new TrackSchemeOverlay( graph, highlight, focus, new PaintDecorations(), new PaintBranchGraph(), diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchy.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchy.java index d71f1d507..06aaf22e4 100644 --- a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchy.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackSchemeHierarchy.java @@ -151,7 +151,7 @@ private static class HierarchyTrackSchemeOverlayFactory extends TrackSchemeOverl public TrackSchemeOverlay create( final TrackSchemeGraph< ?, ? > graph, final HighlightModel< TrackSchemeVertex, TrackSchemeEdge > highlight, - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus, + final FocusModel< TrackSchemeVertex > focus, final TrackSchemeOptions options ) { return new TrackSchemeOverlay( graph, highlight, focus, new PaintDecorations(), diff --git a/src/main/java/org/mastodon/model/AutoNavigateFocusModel.java b/src/main/java/org/mastodon/model/AutoNavigateFocusModel.java index db1021b7b..1d6a8a099 100644 --- a/src/main/java/org/mastodon/model/AutoNavigateFocusModel.java +++ b/src/main/java/org/mastodon/model/AutoNavigateFocusModel.java @@ -46,23 +46,23 @@ * the type of edges in the graph. */ public class AutoNavigateFocusModel< V extends Vertex< E > & HasTimepoint, E extends Edge< V > > - implements FocusModel< V, E > + implements FocusModel< V > { - private final FocusModel< V, E > focus; + private final FocusModel< V > focus; private final NavigationHandler< V, E > navigation; private final TimepointModel timepointModel; public AutoNavigateFocusModel( - final FocusModel< V, E > focus, + final FocusModel< V > focus, final NavigationHandler< V, E > navigation ) { this( focus, navigation, null ); } public AutoNavigateFocusModel( - final FocusModel< V, E > focus, + final FocusModel< V > focus, final NavigationHandler< V, E > navigation, final TimepointModel timepointModel ) { diff --git a/src/main/java/org/mastodon/model/DefaultFocusModel.java b/src/main/java/org/mastodon/model/DefaultFocusModel.java index ab2d7a6e0..c5577dd9f 100644 --- a/src/main/java/org/mastodon/model/DefaultFocusModel.java +++ b/src/main/java/org/mastodon/model/DefaultFocusModel.java @@ -44,7 +44,7 @@ * the of model edges. */ public class DefaultFocusModel< V extends Vertex< E >, E extends Edge< V > > - implements FocusModel< V, E >, GraphListener< V, E > + implements FocusModel< V >, GraphListener< V, E > { private final GraphIdBimap< V, E > idmap; diff --git a/src/main/java/org/mastodon/model/FocusModel.java b/src/main/java/org/mastodon/model/FocusModel.java index 503017c8c..9204b7a3d 100644 --- a/src/main/java/org/mastodon/model/FocusModel.java +++ b/src/main/java/org/mastodon/model/FocusModel.java @@ -28,7 +28,6 @@ */ package org.mastodon.model; -import org.mastodon.graph.Edge; import org.mastodon.graph.Vertex; import org.scijava.listeners.Listeners; @@ -38,11 +37,8 @@ * * @param * type of model vertices. - * @param - * the of model edges. */ -// TODO: E parameter not needed -public interface FocusModel< V extends Vertex< E >, E extends Edge< V > > +public interface FocusModel< V extends Vertex< ? > > { public void focusVertex( final V vertex ); diff --git a/src/main/java/org/mastodon/model/branch/BranchGraphFocusAdapter.java b/src/main/java/org/mastodon/model/branch/BranchGraphFocusAdapter.java index 9f2a34297..1f94514cd 100644 --- a/src/main/java/org/mastodon/model/branch/BranchGraphFocusAdapter.java +++ b/src/main/java/org/mastodon/model/branch/BranchGraphFocusAdapter.java @@ -43,16 +43,16 @@ public class BranchGraphFocusAdapter< BV extends Vertex< BE >, BE extends Edge< BV > > extends AbstractBranchGraphAdapter< V, E, BV, BE > - implements FocusModel< BV, BE > + implements FocusModel< BV > { - private final FocusModel< V, E > focus; + private final FocusModel< V > focus; public BranchGraphFocusAdapter( final BranchGraph< BV, BE, V, E > branchGraph, final ReadOnlyGraph< V, E > graph, final GraphIdBimap< V, E > idmap, - final FocusModel< V, E > focus ) + final FocusModel< V > focus ) { super( branchGraph, graph, idmap ); this.focus = focus; diff --git a/src/main/java/org/mastodon/ui/FocusActions.java b/src/main/java/org/mastodon/ui/FocusActions.java index 72e74f4fd..7e547244f 100644 --- a/src/main/java/org/mastodon/ui/FocusActions.java +++ b/src/main/java/org/mastodon/ui/FocusActions.java @@ -191,7 +191,7 @@ public static < V extends Vertex< E > & Ref< V >, E extends Edge< V > & Ref< E > final Actions actions, final Graph< V, E > graph, final ReentrantReadWriteLock lock, - final FocusModel< V, E > focus, + final FocusModel< V > focus, final SelectionModel< V, E > selection ) { final FocusActions< V, E > fa = new FocusActions<>( graph, lock, focus, selection ); @@ -224,14 +224,14 @@ private enum Direction private final ReentrantReadWriteLock lock; - private final FocusModel< V, E > focus; + private final FocusModel< V > focus; private final SelectionModel< V, E > selection; public FocusActions( final Graph< V, E > graph, final ReentrantReadWriteLock lock, - final FocusModel< V, E > focus, + final FocusModel< V > focus, final SelectionModel< V, E > selection ) { this.graph = graph; diff --git a/src/main/java/org/mastodon/views/bdv/overlay/BdvSelectionBehaviours.java b/src/main/java/org/mastodon/views/bdv/overlay/BdvSelectionBehaviours.java index 6b86c8735..b78729131 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/BdvSelectionBehaviours.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/BdvSelectionBehaviours.java @@ -30,11 +30,11 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; -import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.NavigationHandler; import org.mastodon.model.SelectionModel; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.ClickBehaviour; import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; @@ -99,7 +99,7 @@ public static < V extends OverlayVertex< V, E >, E extends OverlayEdge< E, V > > final OverlayGraph< V, E > overlayGraph, final OverlayGraphRenderer< V, E > renderer, final SelectionModel< V, E > selection, - final FocusModel< V, E > focus, + final FocusModel< V > focus, final NavigationHandler< V, E > navigation ) { final BdvSelectionBehaviours< V, E > sb = @@ -119,7 +119,7 @@ public static < V extends OverlayVertex< V, E >, E extends OverlayEdge< E, V > > private final SelectionModel< V, E > selection; - private final FocusModel< V, E > focus; + private final FocusModel< V > focus; private final NavigationHandler< V, E > navigation; @@ -127,7 +127,7 @@ private BdvSelectionBehaviours( final OverlayGraph< V, E > overlayGraph, final OverlayGraphRenderer< V, E > renderer, final SelectionModel< V, E > selection, - final FocusModel< V, E > focus, + final FocusModel< V > focus, final NavigationHandler< V, E > navigation ) { this.overlayGraph = overlayGraph; diff --git a/src/main/java/org/mastodon/views/bdv/overlay/EditBehaviours.java b/src/main/java/org/mastodon/views/bdv/overlay/EditBehaviours.java index c34e548e7..e5c43f4fa 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/EditBehaviours.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/EditBehaviours.java @@ -31,10 +31,10 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import org.mastodon.collection.RefSet; -import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.SelectionModel; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.undo.UndoPointMarker; import org.mastodon.views.bdv.overlay.util.JamaEigenvalueDecomposition; import org.scijava.plugin.Plugin; @@ -184,7 +184,7 @@ public static < V extends OverlayVertex< V, E >, E extends OverlayEdge< E, V > > final OverlayGraph< V, E > overlayGraph, final OverlayGraphRenderer< V, E > renderer, final SelectionModel< V, E > selection, - final FocusModel< V, E > focus, + final FocusModel< V > focus, final UndoPointMarker undo, final double minRadius ) { @@ -210,7 +210,7 @@ public static < V extends OverlayVertex< V, E >, E extends OverlayEdge< E, V > > private final SelectionModel< V, E > selection; - private final FocusModel< V, E > focus; + private final FocusModel< V > focus; private final UndoPointMarker undo; @@ -221,7 +221,7 @@ private EditBehaviours( final OverlayGraph< V, E > overlayGraph, final OverlayGraphRenderer< V, E > renderer, final SelectionModel< V, E > selection, - final FocusModel< V, E > focus, + final FocusModel< V > focus, final UndoPointMarker undo, final double normalRadiusChange, final double aBitRadiusChange, diff --git a/src/main/java/org/mastodon/views/bdv/overlay/EditSpecialBehaviours.java b/src/main/java/org/mastodon/views/bdv/overlay/EditSpecialBehaviours.java index 7b7f57378..5589cb776 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/EditSpecialBehaviours.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/EditSpecialBehaviours.java @@ -39,10 +39,10 @@ import java.awt.geom.AffineTransform; import java.util.concurrent.locks.ReentrantReadWriteLock; -import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.SelectionModel; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.undo.UndoPointMarker; import org.mastodon.views.bdv.overlay.ScreenVertexMath.Ellipse; import org.scijava.plugin.Plugin; @@ -123,7 +123,7 @@ public static < V extends OverlayVertex< V, E >, E extends OverlayEdge< E, V > > final OverlayGraph< V, E > overlayGraph, final OverlayGraphRenderer< V, E > renderer, final SelectionModel< V, E > selection, - final FocusModel< V, E > focus, + final FocusModel< V > focus, final UndoPointMarker undo ) { final EditSpecialBehaviours< V, E > eb = @@ -145,7 +145,7 @@ public static < V extends OverlayVertex< V, E >, E extends OverlayEdge< E, V > > private final SelectionModel< V, E > selection; - private final FocusModel< V, E > focus; + private final FocusModel< V > focus; private final UndoPointMarker undo; @@ -156,7 +156,7 @@ private EditSpecialBehaviours( final OverlayGraph< V, E > overlayGraph, final OverlayGraphRenderer< V, E > renderer, final SelectionModel< V, E > selection, - final FocusModel< V, E > focus, + final FocusModel< V > focus, final UndoPointMarker undo ) { this.viewer = viewer; diff --git a/src/main/java/org/mastodon/views/bdv/overlay/OverlayBranchGraphRenderer.java b/src/main/java/org/mastodon/views/bdv/overlay/OverlayBranchGraphRenderer.java index ee41e63fa..6cc9b92ab 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/OverlayBranchGraphRenderer.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/OverlayBranchGraphRenderer.java @@ -56,7 +56,7 @@ public class OverlayBranchGraphRenderer< BV extends OverlayVertex< BV, BE >, BE public OverlayBranchGraphRenderer( final OverlayGraph< BV, BE > graph, final HighlightModel< BV, BE > highlight, - final FocusModel< BV, BE > focus, + final FocusModel< BV > focus, final SelectionModel< BV, BE > selection, final GraphColorGenerator< BV, BE > coloring ) { diff --git a/src/main/java/org/mastodon/views/bdv/overlay/OverlayGraphRenderer.java b/src/main/java/org/mastodon/views/bdv/overlay/OverlayGraphRenderer.java index 450758eea..f24254a65 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/OverlayGraphRenderer.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/OverlayGraphRenderer.java @@ -114,7 +114,7 @@ public class OverlayGraphRenderer< V extends OverlayVertex< V, E >, E extends Ov protected final HighlightModel< V, E > highlight; - protected final FocusModel< V, E > focus; + protected final FocusModel< V > focus; protected final SelectionModel< V, E > selection; @@ -127,7 +127,7 @@ public class OverlayGraphRenderer< V extends OverlayVertex< V, E >, E extends Ov public OverlayGraphRenderer( final OverlayGraph< V, E > graph, final HighlightModel< V, E > highlight, - final FocusModel< V, E > focus, + final FocusModel< V > focus, final SelectionModel< V, E > selection, final GraphColorGenerator< V, E > coloring ) { diff --git a/src/main/java/org/mastodon/views/bdv/overlay/Visibilities.java b/src/main/java/org/mastodon/views/bdv/overlay/Visibilities.java index 4202659bc..b8e9ec184 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/Visibilities.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/Visibilities.java @@ -80,7 +80,7 @@ public class Visibilities< V extends Vertex< E >, E extends Edge< V > > private final SelectionModel< V, E > selectionModel; - private final FocusModel< V, E > focusModel; + private final FocusModel< V > focusModel; private VisibilityMode currentMode; @@ -120,7 +120,7 @@ public class Visibilities< V extends Vertex< E >, E extends Edge< V > > public Visibilities( final ReadOnlyGraph< V, E > graph, final SelectionModel< V, E > selectionModel, - final FocusModel< V, E > focusModel, + final FocusModel< V > focusModel, final ReentrantReadWriteLock lock ) { this.graph = graph; @@ -289,7 +289,7 @@ public static interface Visibility< V extends Vertex< E >, E extends Edge< V > > private class TrackOfFocusedVisibility implements Visibility< V, E >, FocusListener { - private final FocusModel< V, E > focusModel; + private final FocusModel< V > focusModel; private final ReadOnlyGraph< V, E > graph; @@ -299,7 +299,7 @@ private class TrackOfFocusedVisibility implements Visibility< V, E >, FocusListe private final ReentrantReadWriteLock lock; - public TrackOfFocusedVisibility( final ReadOnlyGraph< V, E > graph, final FocusModel< V, E > focusModel, + public TrackOfFocusedVisibility( final ReadOnlyGraph< V, E > graph, final FocusModel< V > focusModel, final ReentrantReadWriteLock lock ) { this.graph = graph; diff --git a/src/main/java/org/mastodon/views/bdv/overlay/ui/DummyBdvPanel.java b/src/main/java/org/mastodon/views/bdv/overlay/ui/DummyBdvPanel.java index c73b376d9..76227a055 100644 --- a/src/main/java/org/mastodon/views/bdv/overlay/ui/DummyBdvPanel.java +++ b/src/main/java/org/mastodon/views/bdv/overlay/ui/DummyBdvPanel.java @@ -144,7 +144,7 @@ public DummyBdvPanel() final GraphIdBimap< Spot, Link > idmap = model.getGraphIdBimap(); final SpatioTemporalIndex< Spot > spatioTemporalIndex = model.getSpatioTemporalIndex(); final SelectionModel< Spot, Link > selection = new DefaultSelectionModel<>( graph, idmap ); - final FocusModel< Spot, Link > focus = new DefaultFocusModel<>( idmap ); + final FocusModel< Spot > focus = new DefaultFocusModel<>( idmap ); final DefaultHighlightModel< Spot, Link > highlight = new DefaultHighlightModel<>( idmap ); final GraphColorGenerator< Spot, Link > coloring = new DefaultGraphColorGenerator<>(); final BoundingSphereRadiusStatistics radiusStats = new BoundingSphereRadiusStatistics( model ); diff --git a/src/main/java/org/mastodon/views/grapher/display/DataDisplayAutoFocus.java b/src/main/java/org/mastodon/views/grapher/display/DataDisplayAutoFocus.java index fd27b0d66..0769610a7 100644 --- a/src/main/java/org/mastodon/views/grapher/display/DataDisplayAutoFocus.java +++ b/src/main/java/org/mastodon/views/grapher/display/DataDisplayAutoFocus.java @@ -30,7 +30,6 @@ import org.mastodon.model.FocusListener; import org.mastodon.model.FocusModel; -import org.mastodon.views.grapher.datagraph.DataEdge; import org.mastodon.views.grapher.datagraph.DataGraphLayout; import org.mastodon.views.grapher.datagraph.DataVertex; import org.mastodon.views.grapher.datagraph.ScreenTransform; @@ -43,11 +42,11 @@ * A {@code FocusModel} for Data that automatically focuses a vertex near the * center of the window if none is focused (on {@code getFocusedVertex()}). */ -public class DataDisplayAutoFocus implements FocusModel< DataVertex, DataEdge >, TransformListener< ScreenTransform > +public class DataDisplayAutoFocus implements FocusModel< DataVertex >, TransformListener< ScreenTransform > { private final DataGraphLayout< ?, ? > layout; - private final FocusModel< DataVertex, DataEdge > focus; + private final FocusModel< DataVertex > focus; private final ScreenTransform screenTransform = new ScreenTransform(); @@ -55,7 +54,7 @@ public class DataDisplayAutoFocus implements FocusModel< DataVertex, DataEdge >, public DataDisplayAutoFocus( final DataGraphLayout< ?, ? > layout, - final FocusModel< DataVertex, DataEdge > focus ) + final FocusModel< DataVertex > focus ) { this.layout = layout; this.focus = focus; diff --git a/src/main/java/org/mastodon/views/grapher/display/DataDisplayFrame.java b/src/main/java/org/mastodon/views/grapher/display/DataDisplayFrame.java index c3c17079d..7027e7708 100644 --- a/src/main/java/org/mastodon/views/grapher/display/DataDisplayFrame.java +++ b/src/main/java/org/mastodon/views/grapher/display/DataDisplayFrame.java @@ -76,7 +76,7 @@ public DataDisplayFrame( final int nSources, final DataGraphLayout< V, E > layout, final HighlightModel< DataVertex, DataEdge > highlight, - final FocusModel< DataVertex, DataEdge > focus, + final FocusModel< DataVertex > focus, final SelectionModel< DataVertex, DataEdge > selection, final NavigationHandler< DataVertex, DataEdge > navigation, final UndoPointMarker undoPointMarker, diff --git a/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationActions.java b/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationActions.java index b9e154ace..65d852ef4 100644 --- a/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationActions.java +++ b/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationActions.java @@ -32,10 +32,10 @@ import org.mastodon.collection.ref.RefArrayList; import org.mastodon.graph.algorithm.traversal.UndirectedDepthFirstIterator; -import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.SelectionModel; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.views.grapher.datagraph.DataEdge; import org.mastodon.views.grapher.datagraph.DataGraph; import org.mastodon.views.grapher.datagraph.DataVertex; @@ -137,13 +137,13 @@ private enum Direction private final SelectionModel< DataVertex, DataEdge > selection; - private final FocusModel< DataVertex, DataEdge > focus; + private final FocusModel< DataVertex > focus; private final RefArrayList< DataVertex > siblings; public DataDisplayNavigationActions( final DataGraph< ?, ? > graph, - final FocusModel< DataVertex, DataEdge > focus, + final FocusModel< DataVertex > focus, final SelectionModel< DataVertex, DataEdge > selection ) { this.graph = graph; diff --git a/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationBehaviours.java b/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationBehaviours.java index d09fb37ea..594c9b194 100644 --- a/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationBehaviours.java +++ b/src/main/java/org/mastodon/views/grapher/display/DataDisplayNavigationBehaviours.java @@ -34,11 +34,11 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import org.mastodon.collection.RefSet; -import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.NavigationHandler; import org.mastodon.model.SelectionModel; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.views.grapher.datagraph.DataEdge; import org.mastodon.views.grapher.datagraph.DataGraph; import org.mastodon.views.grapher.datagraph.DataGraphLayout; @@ -127,7 +127,7 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) private final DataDisplayOverlay graphOverlay; - private final FocusModel< DataVertex, DataEdge > focus; + private final FocusModel< DataVertex > focus; private final ScreenTransform screenTransform; @@ -155,7 +155,7 @@ public DataDisplayNavigationBehaviours( final DataGraph< ?, ? > graph, final DataGraphLayout< ?, ? > layout, final DataDisplayOverlay graphOverlay, - final FocusModel< DataVertex, DataEdge > focus, + final FocusModel< DataVertex > focus, final NavigationHandler< DataVertex, DataEdge > navigation, final SelectionModel< DataVertex, DataEdge > selection ) { diff --git a/src/main/java/org/mastodon/views/grapher/display/DataDisplayOverlay.java b/src/main/java/org/mastodon/views/grapher/display/DataDisplayOverlay.java index ba8a8ff58..1cd7f4331 100644 --- a/src/main/java/org/mastodon/views/grapher/display/DataDisplayOverlay.java +++ b/src/main/java/org/mastodon/views/grapher/display/DataDisplayOverlay.java @@ -74,7 +74,7 @@ public class DataDisplayOverlay implements OverlayRenderer, OffsetAxesListener private final HighlightModel< DataVertex, DataEdge > highlight; - private final FocusModel< DataVertex, DataEdge > focus; + private final FocusModel< DataVertex > focus; private int width; @@ -115,7 +115,7 @@ public class DataDisplayOverlay implements OverlayRenderer, OffsetAxesListener public DataDisplayOverlay( final DataGraph< ?, ? > graph, final HighlightModel< DataVertex, DataEdge > highlight, - final FocusModel< DataVertex, DataEdge > focus, + final FocusModel< DataVertex > focus, final PaintDecorations paintDecorations, final PaintGraph paintGraph, final DataDisplayOptions options ) @@ -379,7 +379,7 @@ public static class DataDisplayOverlayFactory public DataDisplayOverlay create( final DataGraph< ?, ? > graph, final HighlightModel< DataVertex, DataEdge > highlight, - final FocusModel< DataVertex, DataEdge > focus, + final FocusModel< DataVertex > focus, final DataDisplayOptions options ) { return new DataDisplayOverlay( diff --git a/src/main/java/org/mastodon/views/grapher/display/DataDisplayPanel.java b/src/main/java/org/mastodon/views/grapher/display/DataDisplayPanel.java index 1f0be0de3..7f1bf331f 100644 --- a/src/main/java/org/mastodon/views/grapher/display/DataDisplayPanel.java +++ b/src/main/java/org/mastodon/views/grapher/display/DataDisplayPanel.java @@ -202,7 +202,7 @@ public DataDisplayPanel( final DataGraph< V, E > graph, final DataGraphLayout< V, E > layout, final HighlightModel< DataVertex, DataEdge > highlight, - final FocusModel< DataVertex, DataEdge > focus, + final FocusModel< DataVertex > focus, final SelectionModel< DataVertex, DataEdge > selection, final NavigationHandler< DataVertex, DataEdge > navigation, final DataDisplayOptions optional ) diff --git a/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleEditorPanel.java b/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleEditorPanel.java index cced97b54..cc1010f29 100644 --- a/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleEditorPanel.java +++ b/src/main/java/org/mastodon/views/grapher/display/style/DataDisplayStyleEditorPanel.java @@ -130,7 +130,7 @@ public DataDisplayStyleEditorPanel( final DataDisplayStyle style ) final RefBimap< DummyEdge, DataEdge > edgeMap = new DataEdgeBimap<>( graph ); final HighlightModel< DataVertex, DataEdge > highlight = new HighlightModelAdapter<>( new DefaultHighlightModel<>( idmap ), vertexMap, edgeMap ); - final FocusModel< DataVertex, DataEdge > focus = + final FocusModel< DataVertex > focus = new FocusModelAdapter<>( new DefaultFocusModel<>( idmap ), vertexMap, edgeMap ); final SelectionModel< DataVertex, DataEdge > selection = new SelectionModelAdapter<>( ex.getSelectionModel(), vertexMap, edgeMap ); diff --git a/src/main/java/org/mastodon/views/table/TableViewFrameBuilder.java b/src/main/java/org/mastodon/views/table/TableViewFrameBuilder.java index b177b8395..0a842efea 100644 --- a/src/main/java/org/mastodon/views/table/TableViewFrameBuilder.java +++ b/src/main/java/org/mastodon/views/table/TableViewFrameBuilder.java @@ -188,7 +188,7 @@ private final class GraphTableBundle< VV extends Vertex< EE >, EE extends Edge< private final SelectionModel< VV, EE > selectionModel; - private final FocusModel< VV, EE > focusModel; + private final FocusModel< VV > focusModel; private final HighlightModel< VV, EE > highlightModel; @@ -632,7 +632,7 @@ public static class GraphTableBuilder< V extends Vertex< E >, E extends Edge< V private SelectionModel< V, E > selectionModel; - private FocusModel< V, E > focusModel; + private FocusModel< V > focusModel; private HighlightModel< V, E > highlightModel; @@ -719,7 +719,7 @@ public GraphTableBuilder< V, E > selectionModel( final SelectionModel< V, E > se return this; } - public GraphTableBuilder< V, E > focusModel( final FocusModel< V, E > focusModel ) + public GraphTableBuilder< V, E > focusModel( final FocusModel< V > focusModel ) { this.focusModel = focusModel; return this; diff --git a/src/main/java/org/mastodon/views/trackscheme/display/BranchTrackSchemeEditLabelAction.java b/src/main/java/org/mastodon/views/trackscheme/display/BranchTrackSchemeEditLabelAction.java index 9b2175a14..024d6745b 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/BranchTrackSchemeEditLabelAction.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/BranchTrackSchemeEditLabelAction.java @@ -36,7 +36,6 @@ import org.mastodon.model.FocusModel; import org.mastodon.model.HasLabel; import org.mastodon.undo.UndoPointMarker; -import org.mastodon.views.trackscheme.TrackSchemeEdge; import org.mastodon.views.trackscheme.TrackSchemeGraph; import org.mastodon.views.trackscheme.TrackSchemeVertex; import org.scijava.ui.behaviour.util.Actions; @@ -52,7 +51,7 @@ public class BranchTrackSchemeEditLabelAction E extends Edge< V > > void install( final Actions actions, final TrackSchemePanel panel, - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus, + final FocusModel< TrackSchemeVertex > focus, final UndoPointMarker undoPointMarker, final BranchGraph< BV, BE, V, E > branchGraph ) { @@ -75,7 +74,7 @@ private static class BranchTrackSchemeEditLabelActionImp< BV extends Vertex< BE private final BranchGraph< BV, BE, V, E > branchGraph; protected BranchTrackSchemeEditLabelActionImp( - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus, + final FocusModel< TrackSchemeVertex > focus, final UndoPointMarker undoPointMarker, final TrackSchemePanel panel, final BranchGraph< BV, BE, V, E > branchGraph ) diff --git a/src/main/java/org/mastodon/views/trackscheme/display/EditFocusVertexLabelAction.java b/src/main/java/org/mastodon/views/trackscheme/display/EditFocusVertexLabelAction.java index 465daf019..c69fe3cb4 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/EditFocusVertexLabelAction.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/EditFocusVertexLabelAction.java @@ -48,7 +48,6 @@ import org.mastodon.undo.UndoPointMarker; import org.mastodon.util.KeyConfigUtils; import org.mastodon.views.trackscheme.ScreenTransform; -import org.mastodon.views.trackscheme.TrackSchemeEdge; import org.mastodon.views.trackscheme.TrackSchemeVertex; import org.mastodon.views.trackscheme.display.OffsetHeaders.OffsetHeadersListener; import org.scijava.plugin.Plugin; @@ -103,7 +102,7 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) private final FontMetrics fontMetrics; - private final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus; + private final FocusModel< TrackSchemeVertex > focus; /** * current width of vertical header. @@ -118,7 +117,7 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) public static void install( final Actions actions, final TrackSchemePanel panel, - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus, + final FocusModel< TrackSchemeVertex > focus, final UndoPointMarker undoPointMarker ) { final EditFocusVertexLabelAction editFocusVertexLabelAction = @@ -129,7 +128,7 @@ public static void install( } protected EditFocusVertexLabelAction( - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus, + final FocusModel< TrackSchemeVertex > focus, final UndoPointMarker undoPointMarker, final TrackSchemePanel panel ) { diff --git a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeAutoFocus.java b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeAutoFocus.java index 574a6d801..4597c102b 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeAutoFocus.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeAutoFocus.java @@ -28,15 +28,14 @@ */ package org.mastodon.views.trackscheme.display; -import bdv.viewer.TransformListener; import org.mastodon.model.FocusListener; import org.mastodon.model.FocusModel; import org.mastodon.views.trackscheme.LineageTreeLayout; import org.mastodon.views.trackscheme.ScreenTransform; -import org.mastodon.views.trackscheme.TrackSchemeEdge; import org.mastodon.views.trackscheme.TrackSchemeVertex; import org.scijava.listeners.Listeners; +import bdv.viewer.TransformListener; import net.imglib2.RealPoint; /** @@ -44,11 +43,11 @@ * the center of the window if none is focused (on {@code getFocusedVertex()}). */ public class TrackSchemeAutoFocus - implements FocusModel< TrackSchemeVertex, TrackSchemeEdge >, TransformListener< ScreenTransform > + implements FocusModel< TrackSchemeVertex >, TransformListener< ScreenTransform > { private final LineageTreeLayout layout; - private final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus; + private final FocusModel< TrackSchemeVertex > focus; private final ScreenTransform screenTransform = new ScreenTransform(); @@ -58,7 +57,7 @@ public class TrackSchemeAutoFocus public TrackSchemeAutoFocus( final LineageTreeLayout layout, - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus ) + final FocusModel< TrackSchemeVertex > focus ) { this.layout = layout; this.focus = focus; diff --git a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeFrame.java b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeFrame.java index 6f544d2c4..b104ec82b 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeFrame.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeFrame.java @@ -67,7 +67,7 @@ public class TrackSchemeFrame extends ViewFrame public TrackSchemeFrame( final TrackSchemeGraph< ?, ? > graph, final HighlightModel< TrackSchemeVertex, TrackSchemeEdge > highlight, - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus, + final FocusModel< TrackSchemeVertex > focus, final TimepointModel timepointModel, final FadingModel< TrackSchemeVertex, TrackSchemeEdge > fadingModel, final SelectionModel< TrackSchemeVertex, TrackSchemeEdge > selection, diff --git a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationActions.java b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationActions.java index df8180344..683fd0463 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationActions.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationActions.java @@ -30,10 +30,10 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; -import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.SelectionModel; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.views.trackscheme.LineageTreeLayout; import org.mastodon.views.trackscheme.TrackSchemeEdge; import org.mastodon.views.trackscheme.TrackSchemeGraph; @@ -160,7 +160,7 @@ public enum NavigatorEtiquette private final SelectionModel< TrackSchemeVertex, TrackSchemeEdge > selection; - private final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus; + private final FocusModel< TrackSchemeVertex > focus; /** * Creates a new {@link TrackSchemeNavigationActions}. @@ -179,7 +179,7 @@ public enum NavigatorEtiquette public TrackSchemeNavigationActions( final TrackSchemeGraph< ?, ? > graph, final LineageTreeLayout layout, - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus, + final FocusModel< TrackSchemeVertex > focus, final SelectionModel< TrackSchemeVertex, TrackSchemeEdge > selection ) { this.graph = graph; diff --git a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationBehaviours.java b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationBehaviours.java index fa42212eb..11c50a11c 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationBehaviours.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeNavigationBehaviours.java @@ -33,11 +33,11 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import org.mastodon.collection.RefSet; -import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.FocusModel; import org.mastodon.model.NavigationHandler; import org.mastodon.model.SelectionModel; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.views.trackscheme.LineageTreeLayout; import org.mastodon.views.trackscheme.ScreenTransform; import org.mastodon.views.trackscheme.TrackSchemeEdge; @@ -128,7 +128,7 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) private final TrackSchemeOverlay graphOverlay; - private final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus; + private final FocusModel< TrackSchemeVertex > focus; private final ScreenTransform screenTransform; @@ -159,7 +159,7 @@ public TrackSchemeNavigationBehaviours( final TrackSchemeGraph< ?, ? > graph, final LineageTreeLayout layout, final TrackSchemeOverlay graphOverlay, - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus, + final FocusModel< TrackSchemeVertex > focus, final NavigationHandler< TrackSchemeVertex, TrackSchemeEdge > navigation, final SelectionModel< TrackSchemeVertex, TrackSchemeEdge > selection ) { diff --git a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeOverlay.java b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeOverlay.java index 7b599f4f5..9993b8304 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeOverlay.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemeOverlay.java @@ -28,7 +28,6 @@ */ package org.mastodon.views.trackscheme.display; -import bdv.viewer.OverlayRenderer; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; @@ -47,6 +46,8 @@ import org.mastodon.views.trackscheme.display.OffsetHeaders.OffsetHeadersListener; import org.mastodon.views.trackscheme.display.style.TrackSchemeStyle; +import bdv.viewer.OverlayRenderer; + /** * An {@link OverlayRenderer} that paints {@link ScreenEntities} of a * TrackScheme graph. Comprises methods to paint vertices, edges, and dense @@ -106,7 +107,7 @@ public class TrackSchemeOverlay implements OverlayRenderer, OffsetHeadersListene private final HighlightModel< TrackSchemeVertex, TrackSchemeEdge > highlight; - private final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus; + private final FocusModel< TrackSchemeVertex > focus; private int currentTimepoint = 0; @@ -149,7 +150,7 @@ public class TrackSchemeOverlay implements OverlayRenderer, OffsetHeadersListene public TrackSchemeOverlay( final TrackSchemeGraph< ?, ? > graph, final HighlightModel< TrackSchemeVertex, TrackSchemeEdge > highlight, - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus, + final FocusModel< TrackSchemeVertex > focus, final PaintDecorations paintDecorations, final PaintGraph paintGraph, final TrackSchemeOptions options ) @@ -427,7 +428,7 @@ public static class TrackSchemeOverlayFactory public TrackSchemeOverlay create( final TrackSchemeGraph< ?, ? > graph, final HighlightModel< TrackSchemeVertex, TrackSchemeEdge > highlight, - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus, + final FocusModel< TrackSchemeVertex > focus, final TrackSchemeOptions options ) { return new TrackSchemeOverlay( graph, highlight, focus, new PaintDecorations(), new PaintGraph(), options ); diff --git a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemePanel.java b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemePanel.java index 4ca5be952..1ee95c9e7 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemePanel.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/TrackSchemePanel.java @@ -199,7 +199,7 @@ public class TrackSchemePanel extends JPanel implements public TrackSchemePanel( final TrackSchemeGraph< ?, ? > graph, final HighlightModel< TrackSchemeVertex, TrackSchemeEdge > highlight, - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus, + final FocusModel< TrackSchemeVertex > focus, final TimepointModel timepointModel, final FadingModel< TrackSchemeVertex, TrackSchemeEdge > fadingModel, final SelectionModel< TrackSchemeVertex, TrackSchemeEdge > selection, @@ -911,7 +911,7 @@ public void continueAnimation( final ScreenTransform transform, final long durat } } - private void runCropAndScale( ScreenTransform transform ) + private void runCropAndScale( final ScreenTransform transform ) { layout.cropAndScale( transform, screenEntities, offsetHeaders.getWidth(), offsetHeaders.getHeight() ); } diff --git a/src/main/java/org/mastodon/views/trackscheme/display/style/TrackSchemeStyleEditorPanel.java b/src/main/java/org/mastodon/views/trackscheme/display/style/TrackSchemeStyleEditorPanel.java index 56a33d27b..042da1a71 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/style/TrackSchemeStyleEditorPanel.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/style/TrackSchemeStyleEditorPanel.java @@ -123,8 +123,7 @@ public TrackSchemeStyleEditorPanel( final TrackSchemeStyle style ) final RefBimap< DummyEdge, TrackSchemeEdge > edgeMap = new TrackSchemeEdgeBimap<>( graph ); final HighlightModel< TrackSchemeVertex, TrackSchemeEdge > highlight = new HighlightModelAdapter<>( new DefaultHighlightModel<>( idmap ), vertexMap, edgeMap ); - final FocusModel< TrackSchemeVertex, TrackSchemeEdge > focus = - new FocusModelAdapter<>( new DefaultFocusModel<>( idmap ), vertexMap, edgeMap ); + final FocusModel< TrackSchemeVertex > focus = new FocusModelAdapter<>( new DefaultFocusModel<>( idmap ), vertexMap, edgeMap ); final TimepointModel timepoint = new DefaultTimepointModel(); final SelectionModel< TrackSchemeVertex, TrackSchemeEdge > selection = new SelectionModelAdapter<>( ex.getSelectionModel(), vertexMap, edgeMap ); diff --git a/src/test/java/org/mastodon/util/MastodonUtils.java b/src/test/java/org/mastodon/util/MastodonUtils.java index 09061dd2e..5440cee67 100644 --- a/src/test/java/org/mastodon/util/MastodonUtils.java +++ b/src/test/java/org/mastodon/util/MastodonUtils.java @@ -120,7 +120,7 @@ public static void logMastodonEvents( final ProjectModel appModel ) private static void logFocusModel( final ProjectModel appModel ) { - final FocusModel< Spot, Link > focusModel = appModel.getFocusModel(); + final FocusModel< Spot > focusModel = appModel.getFocusModel(); final ModelGraph graph = appModel.getModel().getGraph(); focusModel.listeners().add( () -> { final Spot ref = graph.vertexRef(); From 6ebff35b4ab84a99e316d1804f88866575118c97 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 25 Aug 2023 13:57:59 +0200 Subject: [PATCH 072/220] Save BDV settings when we save a Mastodon file. Imperfect because a full saving requires have a BDV view opened, which is not necessarily our case. When we don't have a view opened, save everything we can but no more. Fixes #230 --- .../org/mastodon/mamut/io/ProjectSaver.java | 28 +++++++++++++++++++ .../views/bdv/SharedBigDataViewerData.java | 3 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java index 5fc69ebbc..f1ae61fec 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java @@ -15,6 +15,7 @@ import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.nio.file.Files; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import javax.swing.JOptionPane; @@ -39,6 +40,7 @@ import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; import org.mastodon.mamut.views.MamutViewFactory; +import org.mastodon.mamut.views.bdv.MamutViewBdv; import org.mastodon.ui.util.ExtensionFileFilter; import org.mastodon.ui.util.FileChooser; import org.mastodon.ui.util.FileChooser.SelectionMode; @@ -242,6 +244,32 @@ public static synchronized void saveProject( final File saveTo, final ProjectMod // Set save point. model.setSavePoint(); } + + // Save BDV settings. + // Imperfect because a full saving requires have a view opened, + // which is not necessarily our case. + final SharedBigDataViewerData sbdv = appModel.getSharedBdvData(); + if ( sbdv.getProposedSettingsFile() != null ) + { + final String settingsFile = sbdv.getProposedSettingsFile().getAbsolutePath(); + final AtomicBoolean alreadySaved = new AtomicBoolean( false ); + appModel.getWindowManager().forEachView( MamutViewBdv.class, ( v ) -> { + if ( !alreadySaved.get() ) + { + try + { + sbdv.saveSettings( settingsFile, v.getViewerPanelMamut() ); + alreadySaved.set( true ); + } + catch ( final IOException e ) + { + e.printStackTrace(); + } + } + } ); + if ( !alreadySaved.get() ) + sbdv.saveSettings( settingsFile, null ); + } } /** diff --git a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java index 20fa2d7a3..9bc18db93 100644 --- a/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java +++ b/src/main/java/org/mastodon/views/bdv/SharedBigDataViewerData.java @@ -206,7 +206,8 @@ public void loadSettings( final String xmlFilename, final ViewerPanel viewer ) t public void saveSettings( final String xmlFilename, final ViewerPanel viewer ) throws IOException { final Element root = new Element( "Settings" ); - root.addContent( viewer.stateToXml() ); + if ( viewer != null ) + root.addContent( viewer.stateToXml() ); root.addContent( toXmlSetupAssignments() ); root.addContent( manualTransformation.toXml() ); root.addContent( bookmarks.toXml() ); From 51a7cb0a5b9b7eedb2a920e7f18bd7d95a44633c Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 25 Aug 2023 14:23:37 +0200 Subject: [PATCH 073/220] Add the colorbar overlay to the trackscheme branch view. --- .../mamut/views/trackscheme/MamutBranchViewTrackScheme.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java index 9d447cf31..2681344e4 100644 --- a/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java +++ b/src/main/java/org/mastodon/mamut/views/trackscheme/MamutBranchViewTrackScheme.java @@ -264,6 +264,8 @@ protected MamutBranchViewTrackScheme( model.getGraph().addVertexLabelListener( v -> SwingUtilities.invokeLater( () -> frame.getTrackschemePanel().entitiesAttributesChanged() ) ); + frame.getTrackschemePanel().getDisplay().overlays().add( colorBarOverlay ); + // Time range and display refresh. frame.getTrackschemePanel().setTimepointRange( appModel.getMinTimepoint(), appModel.getMaxTimepoint() ); frame.getTrackschemePanel().graphChanged(); From 1dab5429eeb5c2af9f56f2497e2f5e1eb59df0c9 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 25 Aug 2023 14:53:44 +0200 Subject: [PATCH 074/220] Make the color bar overlay listenable. --- .../mastodon/ui/coloring/ColorBarOverlay.java | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mastodon/ui/coloring/ColorBarOverlay.java b/src/main/java/org/mastodon/ui/coloring/ColorBarOverlay.java index 1d5779b41..645dc49ae 100644 --- a/src/main/java/org/mastodon/ui/coloring/ColorBarOverlay.java +++ b/src/main/java/org/mastodon/ui/coloring/ColorBarOverlay.java @@ -38,6 +38,7 @@ import org.mastodon.model.tag.TagSetStructure.TagSet; import org.mastodon.ui.coloring.feature.FeatureColorMode; import org.mastodon.ui.coloring.feature.FeatureProjectionId; +import org.scijava.listeners.Listeners; import bdv.viewer.OverlayRenderer; @@ -144,6 +145,8 @@ public int yOrigin( final int canvasHeight, final int barHeight, final int[] ins private final Supplier< Color > bgColorSupplier; + private final Listeners.List< ColorBarOverlayListener > listeners = new Listeners.List<>(); + /** * Space between the panel border and the overlay border. 4 elements: top, * left, bottom, right. @@ -157,6 +160,22 @@ public ColorBarOverlay( final ColoringModel coloringModel, final Supplier< Color this.insets = new int[] { 15, 15, 15, 15 }; } + /** + * Returns the listeners objects, that will be notified when the this color + * bar overlay settings are changed. + * + * @return the listeners list. + */ + public Listeners.List< ColorBarOverlayListener > listeners() + { + return listeners; + } + + private void notifyListeners() + { + listeners.list.forEach( l -> l.colorBarOverlayChanged() ); + } + @Override public void drawOverlays( final Graphics g ) { @@ -414,12 +433,20 @@ public void setCanvasSize( final int width, final int height ) public void setVisible( final boolean visible ) { - this.visible = visible; + if ( this.visible != visible ) + { + this.visible = visible; + notifyListeners(); + } } public void setPosition( final Position position ) { - this.position = position; + if ( position != this.position ) + { + this.position = position; + notifyListeners(); + } } public void setInsets( final int top, final int left, final int bottom, final int right ) @@ -439,4 +466,9 @@ public Position getPosition() { return position; } + + public interface ColorBarOverlayListener + { + void colorBarOverlayChanged(); + } } From e656e6f18d7f4f74ff466b0f22a9465b8d575765 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 25 Aug 2023 14:55:08 +0200 Subject: [PATCH 075/220] Use a dedicated menu class for the colorbar overlay menu. It listens to programmatic changes in the color bar overlay, which ensures the menu is in sync with what the colorbar is configured with. This is important when restoring the GUI state. Concomittantly: we have one class more, but we diminish the duplicated code between MamutView and MamutBranchView. --- .../mastodon/mamut/views/MamutBranchView.java | 38 +------ .../org/mastodon/mamut/views/MamutView.java | 37 +------ .../ui/coloring/ColorBarOverlayMenu.java | 98 +++++++++++++++++++ 3 files changed, 104 insertions(+), 69 deletions(-) create mode 100644 src/main/java/org/mastodon/ui/coloring/ColorBarOverlayMenu.java diff --git a/src/main/java/org/mastodon/mamut/views/MamutBranchView.java b/src/main/java/org/mastodon/mamut/views/MamutBranchView.java index 795e52e0d..32957de61 100644 --- a/src/main/java/org/mastodon/mamut/views/MamutBranchView.java +++ b/src/main/java/org/mastodon/mamut/views/MamutBranchView.java @@ -32,11 +32,6 @@ import java.awt.event.WindowEvent; import java.util.ArrayList; -import javax.swing.ButtonGroup; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.JSeparator; - import org.mastodon.adapter.FocusModelAdapter; import org.mastodon.adapter.HighlightModelAdapter; import org.mastodon.adapter.NavigationHandlerAdapter; @@ -70,7 +65,7 @@ import org.mastodon.model.tag.TagSetModel; import org.mastodon.ui.TagSetMenu; import org.mastodon.ui.coloring.ColorBarOverlay; -import org.mastodon.ui.coloring.ColorBarOverlay.Position; +import org.mastodon.ui.coloring.ColorBarOverlayMenu; import org.mastodon.ui.coloring.ColoringMenu; import org.mastodon.ui.coloring.ColoringModel; import org.mastodon.ui.coloring.ColoringModelBranchGraph; @@ -292,35 +287,8 @@ protected void registerColorbarOverlay( final JMenuHandle menuHandle, final Runnable refresh ) { - menuHandle.getMenu().add( new JSeparator() ); - final JCheckBoxMenuItem toggleOverlay = - new JCheckBoxMenuItem( "Show colorbar", ColorBarOverlay.DEFAULT_VISIBLE ); - toggleOverlay.addActionListener( ( l ) -> { - colorBarOverlay.setVisible( toggleOverlay.isSelected() ); - refresh.run(); - } ); - menuHandle.getMenu().add( toggleOverlay ); - - menuHandle.getMenu().add( new JSeparator() ); - menuHandle.getMenu().add( "Position:" ).setEnabled( false ); - - final ButtonGroup buttonGroup = new ButtonGroup(); - for ( final Position position : Position.values() ) - { - final JRadioButtonMenuItem positionItem = new JRadioButtonMenuItem( position.toString() ); - positionItem.addActionListener( ( l ) -> { - if ( positionItem.isSelected() ) - { - colorBarOverlay.setPosition( position ); - refresh.run(); - } - } ); - buttonGroup.add( positionItem ); - menuHandle.getMenu().add( positionItem ); - - if ( position.equals( ColorBarOverlay.DEFAULT_POSITION ) ) - positionItem.setSelected( true ); - } + final ColorBarOverlayMenu menu = new ColorBarOverlayMenu( menuHandle.getMenu(), colorBarOverlay, refresh ); + colorBarOverlay.listeners().add( menu ); } protected void registerTagSetMenu( diff --git a/src/main/java/org/mastodon/mamut/views/MamutView.java b/src/main/java/org/mastodon/mamut/views/MamutView.java index b4389eec9..ee04b2f1d 100644 --- a/src/main/java/org/mastodon/mamut/views/MamutView.java +++ b/src/main/java/org/mastodon/mamut/views/MamutView.java @@ -33,11 +33,6 @@ import java.util.List; import java.util.Map; -import javax.swing.ButtonGroup; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.JSeparator; - import org.mastodon.app.ViewGraph; import org.mastodon.app.ui.MastodonFrameView; import org.mastodon.app.ui.ViewFrame; @@ -59,6 +54,7 @@ import org.mastodon.ui.TagSetMenu; import org.mastodon.ui.coloring.ColorBarOverlay; import org.mastodon.ui.coloring.ColorBarOverlay.Position; +import org.mastodon.ui.coloring.ColorBarOverlayMenu; import org.mastodon.ui.coloring.ColoringMenu; import org.mastodon.ui.coloring.ColoringModel; import org.mastodon.ui.coloring.ColoringModelMain; @@ -206,35 +202,8 @@ protected void registerColorbarOverlay( final JMenuHandle menuHandle, final Runnable refresh ) { - menuHandle.getMenu().add( new JSeparator() ); - final JCheckBoxMenuItem toggleOverlay = - new JCheckBoxMenuItem( "Show colorbar", ColorBarOverlay.DEFAULT_VISIBLE ); - toggleOverlay.addActionListener( ( l ) -> { - colorBarOverlay.setVisible( toggleOverlay.isSelected() ); - refresh.run(); - } ); - menuHandle.getMenu().add( toggleOverlay ); - - menuHandle.getMenu().add( new JSeparator() ); - menuHandle.getMenu().add( "Position:" ).setEnabled( false ); - - final ButtonGroup buttonGroup = new ButtonGroup(); - for ( final Position position : Position.values() ) - { - final JRadioButtonMenuItem positionItem = new JRadioButtonMenuItem( position.toString() ); - positionItem.addActionListener( ( l ) -> { - if ( positionItem.isSelected() ) - { - colorBarOverlay.setPosition( position ); - refresh.run(); - } - } ); - buttonGroup.add( positionItem ); - menuHandle.getMenu().add( positionItem ); - - if ( position.equals( ColorBarOverlay.DEFAULT_POSITION ) ) - positionItem.setSelected( true ); - } + final ColorBarOverlayMenu menu = new ColorBarOverlayMenu( menuHandle.getMenu(), colorBarOverlay, refresh ); + colorBarOverlay.listeners().add( menu ); } protected void registerTagSetMenu( diff --git a/src/main/java/org/mastodon/ui/coloring/ColorBarOverlayMenu.java b/src/main/java/org/mastodon/ui/coloring/ColorBarOverlayMenu.java new file mode 100644 index 000000000..e88d31060 --- /dev/null +++ b/src/main/java/org/mastodon/ui/coloring/ColorBarOverlayMenu.java @@ -0,0 +1,98 @@ +/*- + * #%L + * Mastodon + * %% + * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ +package org.mastodon.ui.coloring; + +import javax.swing.ButtonGroup; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JMenu; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.JSeparator; + +import org.mastodon.ui.coloring.ColorBarOverlay.ColorBarOverlayListener; +import org.mastodon.ui.coloring.ColorBarOverlay.Position; + +public class ColorBarOverlayMenu implements ColorBarOverlayListener +{ + private final JMenu menu; + + private final ColorBarOverlay colorBarOverlay; + + private final Runnable refresh; + + public ColorBarOverlayMenu( + final JMenu menu, + final ColorBarOverlay colorBarOverlay, + final Runnable refresh ) + { + this.menu = menu; + this.colorBarOverlay = colorBarOverlay; + this.refresh = refresh; + rebuild(); + } + + public void rebuild() + { + menu.removeAll(); + menu.add( new JSeparator() ); + final JCheckBoxMenuItem toggleOverlay = + new JCheckBoxMenuItem( "Show colorbar", colorBarOverlay.isVisible() ); + toggleOverlay.addActionListener( ( l ) -> { + colorBarOverlay.setVisible( toggleOverlay.isSelected() ); + refresh.run(); + } ); + menu.add( toggleOverlay ); + + menu.add( new JSeparator() ); + menu.add( "Position:" ).setEnabled( colorBarOverlay.isVisible() ); + + final ButtonGroup buttonGroup = new ButtonGroup(); + for ( final Position position : Position.values() ) + { + final JRadioButtonMenuItem positionItem = new JRadioButtonMenuItem( position.toString() ); + positionItem.addActionListener( ( l ) -> { + if ( positionItem.isSelected() ) + { + colorBarOverlay.setPosition( position ); + refresh.run(); + } + } ); + buttonGroup.add( positionItem ); + menu.add( positionItem ); + + if ( position.equals( colorBarOverlay.getPosition() ) ) + positionItem.setSelected( true ); + } + } + + @Override + public void colorBarOverlayChanged() + { + rebuild(); + } +} From 57e51141fcf695044bb5cbf4cb0afbe660376717 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 25 Aug 2023 14:59:40 +0200 Subject: [PATCH 076/220] When loading a project, build the branch graph. Because we build it before regenerating the GUI state, the TrackScheme transforms of the branch trackschemes are now properly restored. With the previous commits, fixes #243 --- src/main/java/org/mastodon/mamut/io/ProjectLoader.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java index 286865cc0..08029a205 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectLoader.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectLoader.java @@ -164,6 +164,9 @@ public static ProjectModel open( final MamutProject project, final Context conte // Build app model. final ProjectModel appModel = ProjectModel.create( context, model, imageData, project ); + // Build the branch graph now. + appModel.getBranchGraphSync().sync(); + // Restore GUI state. if ( restoreGUIState ) loadGUI( project, appModel.getWindowManager() ); From 2ca2de8dfff006405e92f9c2a9d03d2df7176bf8 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 25 Aug 2023 15:00:22 +0200 Subject: [PATCH 077/220] Have a launcher main class that exits gracefully. Before this commits, all the sessions launched with this class failed to terminate properly. --- .../org/mastodon/StartMastodonOnProject.java | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/test/java/org/mastodon/StartMastodonOnProject.java b/src/test/java/org/mastodon/StartMastodonOnProject.java index 96fed9b24..44a986042 100644 --- a/src/test/java/org/mastodon/StartMastodonOnProject.java +++ b/src/test/java/org/mastodon/StartMastodonOnProject.java @@ -28,10 +28,7 @@ */ package org.mastodon; -import java.io.IOException; - import javax.swing.JFileChooser; -import javax.swing.SwingUtilities; import javax.swing.WindowConstants; import javax.swing.filechooser.FileNameExtensionFilter; @@ -39,8 +36,7 @@ import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.ProjectLoader; import org.scijava.Context; - -import mpicbg.spim.data.SpimDataException; +import org.scijava.thread.ThreadService; /** * Starts Mastodon on a given project file. @@ -56,21 +52,24 @@ public static void main( final String... args ) public static void launch( final String projectPath ) { - SwingUtilities.invokeLater( () -> { - - try - { - System.setProperty( "apple.laf.useScreenMenuBar", "true" ); - final ProjectModel appModel = ProjectLoader.open( projectPath, new Context() ); - final MainWindow win = new MainWindow( appModel ); - win.setVisible( true ); - win.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); - } - catch ( IOException | SpimDataException e ) - { - e.printStackTrace(); - } - } ); + System.setProperty( "apple.laf.useScreenMenuBar", "true" ); + try (Context context = new Context()) + { + final ThreadService threadService = context.getService( ThreadService.class ); + threadService.run( () -> { + try + { + final ProjectModel appModel = ProjectLoader.open( projectPath, context, true, false ); + final MainWindow win = new MainWindow( appModel ); + win.setVisible( true ); + win.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); + } + catch ( final Exception e ) + { + e.printStackTrace(); + } + } ); + } } private static String fileOpenDialog() From d8bea1d570b111459145d35c8991c6cb2182e334 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 25 Aug 2023 15:29:07 +0200 Subject: [PATCH 078/220] When restoring a BDV view, wait a bit before restoring the transform. If we don't wait a little bit, the BDV state, notably the transform, is not restored properly. It is not enough to just display the frame before restoring the transform. We put the delay 0.1s in a separate thread not to block the loading if we have many BDV views. Fixes #251 --- .../mamut/views/bdv/MamutViewBdvFactory.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java index 44d7a903f..6d0b5dbf6 100644 --- a/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java +++ b/src/main/java/org/mastodon/mamut/views/bdv/MamutViewBdvFactory.java @@ -100,16 +100,33 @@ static void getBdvGuiState( final ViewerPanel viewerPanel, final Map< String, Ob static void restoreBdvGuiState( final ViewerPanel viewerPanel, final Map< String, Object > guiState ) { + + // Restore BDV state. + final Element stateEl = ( Element ) guiState.get( BDV_STATE_KEY ); + if ( null != stateEl ) + viewerPanel.stateFromXml( stateEl ); // Restore transform. final AffineTransform3D tLoaded = ( AffineTransform3D ) guiState.get( BDV_TRANSFORM_KEY ); if ( null == tLoaded ) InitializeViewerState.initTransform( viewerPanel ); else - viewerPanel.state().setViewerTransform( tLoaded ); - // Restore BDV state. - final Element stateEl = ( Element ) guiState.get( BDV_STATE_KEY ); - if ( null != stateEl ) - viewerPanel.stateFromXml( stateEl ); + new Thread( () -> { + try + { + /* + * If we don't wait a little bit, the BDV state, notably the + * transform, is not restored properly. We put this in a + * separate thread not to block the loading if we have many + * BDV views. + */ + Thread.sleep( 100 ); + viewerPanel.state().setViewerTransform( tLoaded ); + } + catch ( final InterruptedException e ) + { + e.printStackTrace(); + } + } ).start(); } @Override From 72f6408f395ef1839449321386ef814d4d732a9b Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Sun, 27 Aug 2023 19:31:28 +0200 Subject: [PATCH 079/220] Less gigantic size for the tag-set editor. --- src/main/java/org/mastodon/model/tag/ui/TagSetPanel.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/mastodon/model/tag/ui/TagSetPanel.java b/src/main/java/org/mastodon/model/tag/ui/TagSetPanel.java index 472689c83..dff61f36c 100644 --- a/src/main/java/org/mastodon/model/tag/ui/TagSetPanel.java +++ b/src/main/java/org/mastodon/model/tag/ui/TagSetPanel.java @@ -30,6 +30,7 @@ import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Dimension; import java.util.Iterator; import java.util.Random; @@ -67,6 +68,7 @@ public TagSetPanel() public TagSetPanel( final TagSetStructure tagSetStructure ) { super( new BorderLayout( 0, 0 ) ); + setPreferredSize( new Dimension( 500, 200 ) ); this.tagSetStructure = tagSetStructure; updateListeners = new Listeners.SynchronizedList<>(); @@ -98,7 +100,7 @@ public TagSetPanel( final TagSetStructure tagSetStructure ) splitPane.setResizeWeight( 0 ); splitPane.setContinuousLayout( true ); splitPane.setDividerSize( 10 ); - splitPane.setDividerLocation( 300 ); + splitPane.setDividerLocation( 220 ); splitPane.setBorder( new MatteBorder( 0, 0, 1, 0, Color.LIGHT_GRAY ) ); // splitPane.setBorder( new EmptyBorder( 0, 0, 0, 0 ) ); From 7c12c3800e4fcbe0ac7f4add8c804242be7c588a Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Tue, 29 Aug 2023 17:29:43 +0200 Subject: [PATCH 080/220] FeatureSpecsService must have EXTREMELY_LOW priority. Doing otherwise causes a very weird bug, making Mastodon crash when deployed in Fiji but not in Eclipse. The reason for the crash is the following: When creating the FeatureSpecsService, it immediately runs Specs discovery. For this it needs the PluginService to be ALREADY initialized. This is the case when running Mastodon from Eclipse, but not when running it from Fiji. Setting the priority to extremely low makes sure FeatureSpecsService is initialized among the last, well after the services it depends on. --- src/main/java/org/mastodon/feature/FeatureSpecsService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/mastodon/feature/FeatureSpecsService.java b/src/main/java/org/mastodon/feature/FeatureSpecsService.java index 92b8c994a..06285c5d8 100644 --- a/src/main/java/org/mastodon/feature/FeatureSpecsService.java +++ b/src/main/java/org/mastodon/feature/FeatureSpecsService.java @@ -35,6 +35,7 @@ import java.util.Map; import org.mastodon.app.plugin.PluginUtils; +import org.scijava.Priority; import org.scijava.plugin.Plugin; import org.scijava.service.AbstractService; import org.scijava.service.SciJavaService; @@ -42,7 +43,7 @@ /** * Helper class to discover and hold {@link FeatureSpec}s. */ -@Plugin( type = FeatureSpecsService.class ) +@Plugin( type = FeatureSpecsService.class, priority = Priority.EXTREMELY_LOW ) public class FeatureSpecsService extends AbstractService implements SciJavaService { From 5e623aa728a137b1b83941b033217a142df23275 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Tue, 29 Aug 2023 17:52:03 +0200 Subject: [PATCH 081/220] Be more cautious when meeting an error we don't know about. --- src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java b/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java index d1a896600..2191279e6 100644 --- a/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java +++ b/src/main/java/org/mastodon/mamut/launcher/LauncherUtil.java @@ -438,6 +438,7 @@ else if ( NoRouteToHostException.class.isInstance( e.getCause() ) ) } // Everything else. + e.printStackTrace(); return e.getMessage(); } From abb28c55c845407f0de8246e67740173735d0486 Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Wed, 30 Aug 2023 11:15:59 +0200 Subject: [PATCH 082/220] Add description for the online doc action. So that we don't see warnings everytime we change a setting. --- src/main/java/org/mastodon/mamut/WindowManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 0911a0f93..99700447c 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -609,8 +609,8 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) { descriptions.add( PREFERENCES_DIALOG, PREFERENCES_DIALOG_KEYS, "Edit Mastodon preferences." ); descriptions.add( TAGSETS_DIALOG, TAGSETS_DIALOG_KEYS, "Edit tag definitions." ); - descriptions.add( COMPUTE_FEATURE_DIALOG, COMPUTE_FEATURE_DIALOG_KEYS, - "Show the feature computation dialog." ); + descriptions.add( COMPUTE_FEATURE_DIALOG, COMPUTE_FEATURE_DIALOG_KEYS, "Show the feature computation dialog." ); + descriptions.add( OPEN_ONLINE_DOCUMENTATION, OPEN_ONLINE_DOCUMENTATION_KEYS, "Open a browser with the online documentation for Mastodon." ); } } From b8ee2db415812c782e470d9707c6a54d1721a246 Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Wed, 30 Aug 2023 11:38:24 +0200 Subject: [PATCH 083/220] Fix keystroke context for ShowSelectedTracksActions. --- .../trackscheme/display/ShowSelectedTracksActions.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/mastodon/views/trackscheme/display/ShowSelectedTracksActions.java b/src/main/java/org/mastodon/views/trackscheme/display/ShowSelectedTracksActions.java index a22e40518..fa9c7415c 100644 --- a/src/main/java/org/mastodon/views/trackscheme/display/ShowSelectedTracksActions.java +++ b/src/main/java/org/mastodon/views/trackscheme/display/ShowSelectedTracksActions.java @@ -36,10 +36,10 @@ import org.mastodon.collection.ref.RefSetImp; import org.mastodon.graph.Edge; import org.mastodon.graph.Vertex; -import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.model.RootsModel; import org.mastodon.model.SelectionModel; import org.mastodon.ui.keymap.KeyConfigContexts; +import org.mastodon.ui.keymap.KeyConfigScopes; import org.mastodon.util.TreeUtils; import org.mastodon.views.trackscheme.LexicographicalVertexOrder; import org.mastodon.views.trackscheme.TrackSchemeEdge; @@ -59,15 +59,10 @@ public class ShowSelectedTracksActions< V extends Vertex< E >, E extends Edge< V { public static final String SHOW_TRACK_DOWNWARD = "ts show track downward"; - public static final String SHOW_SELECTED_TRACKS = "ts show selected tracks"; - public static final String SHOW_ALL_TRACKS = "ts show all tracks"; - public static final String[] SHOW_TRACK_DOWNWARD_KEYS = { "ctrl PAGE_DOWN" }; - public static final String[] SHOW_SELECTED_TRACKS_KEYS = { "ctrl SPACE" }; - public static final String[] SHOW_ALL_TRACKS_KEYS = { "ctrl DELETE" }; /** @@ -78,7 +73,7 @@ public static class Descriptions extends CommandDescriptionProvider { public Descriptions() { - super( KeyConfigScopes.MASTODON, KeyConfigContexts.MASTODON ); + super( KeyConfigScopes.MASTODON, KeyConfigContexts.TRACKSCHEME ); } @Override From d950e6b93c96affc244820bf4e281f117202f765 Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Wed, 30 Aug 2023 11:44:59 +0200 Subject: [PATCH 084/220] In the preferences dialog, make a sub-category for core settings page. To separate pages made to configure views, from pages made to control plugins. --- src/main/java/org/mastodon/mamut/WindowManager.java | 4 ++-- .../mamut/managers/DataDisplayStyleManagerFactory.java | 2 +- .../mastodon/mamut/managers/RenderSettingsManagerFactory.java | 2 +- .../mamut/managers/TrackSchemeStyleManagerFactory.java | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 99700447c..503237beb 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -213,8 +213,8 @@ public WindowManager( final ProjectModel appModel ) /* * Extra settings pages. */ - settings.addPage( new KeymapSettingsPage( "Keymap", keymapManager, descriptions ) ); - settings.addPage( new FeatureColorModeConfigPage( "Feature Color Modes", featureColorModeManager, + settings.addPage( new KeymapSettingsPage( "Settings > Keymap", keymapManager, descriptions ) ); + settings.addPage( new FeatureColorModeConfigPage( "Settings > Feature Color Modes", featureColorModeManager, featureProjectionsManager, "Spot", "Link" ) ); settings.pack(); diff --git a/src/main/java/org/mastodon/mamut/managers/DataDisplayStyleManagerFactory.java b/src/main/java/org/mastodon/mamut/managers/DataDisplayStyleManagerFactory.java index e49bea0d8..4ecdee925 100644 --- a/src/main/java/org/mastodon/mamut/managers/DataDisplayStyleManagerFactory.java +++ b/src/main/java/org/mastodon/mamut/managers/DataDisplayStyleManagerFactory.java @@ -27,7 +27,7 @@ public boolean hasSettingsPage() @Override public SettingsPage createSettingsPage( final DataDisplayStyleManager manager ) { - return new DataDisplayStyleSettingsPage( "Grapher Styles", manager ); + return new DataDisplayStyleSettingsPage( "Settings > Grapher Styles", manager ); } @Override diff --git a/src/main/java/org/mastodon/mamut/managers/RenderSettingsManagerFactory.java b/src/main/java/org/mastodon/mamut/managers/RenderSettingsManagerFactory.java index 9483e328d..061ef0e2c 100644 --- a/src/main/java/org/mastodon/mamut/managers/RenderSettingsManagerFactory.java +++ b/src/main/java/org/mastodon/mamut/managers/RenderSettingsManagerFactory.java @@ -27,7 +27,7 @@ public boolean hasSettingsPage() @Override public SettingsPage createSettingsPage( final RenderSettingsManager manager ) { - return new RenderSettingsConfigPage( "BDV Render Settings", manager ); + return new RenderSettingsConfigPage( "Settings > BDV Render Settings", manager ); } @Override diff --git a/src/main/java/org/mastodon/mamut/managers/TrackSchemeStyleManagerFactory.java b/src/main/java/org/mastodon/mamut/managers/TrackSchemeStyleManagerFactory.java index 149bf5075..abe0c1e83 100644 --- a/src/main/java/org/mastodon/mamut/managers/TrackSchemeStyleManagerFactory.java +++ b/src/main/java/org/mastodon/mamut/managers/TrackSchemeStyleManagerFactory.java @@ -27,7 +27,7 @@ public boolean hasSettingsPage() @Override public SettingsPage createSettingsPage( final TrackSchemeStyleManager manager ) { - return new TrackSchemeStyleSettingsPage( "TrackScheme Styles", manager ); + return new TrackSchemeStyleSettingsPage( "Settings > TrackScheme Styles", manager ); } @Override From 0d4dc735f91277130d11623e3dcc9efbf13253e8 Mon Sep 17 00:00:00 2001 From: Jean-Yves TINEVEZ Date: Wed, 30 Aug 2023 12:04:28 +0200 Subject: [PATCH 085/220] Add a method to handle legacy config files for styles. I want to move and rename style files, without breaking things for the user. This will simplofy this process. --- .../app/ui/AbstractStyleManagerYaml.java | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mastodon/app/ui/AbstractStyleManagerYaml.java b/src/main/java/org/mastodon/app/ui/AbstractStyleManagerYaml.java index 53ed4d4bc..5c8af4102 100644 --- a/src/main/java/org/mastodon/app/ui/AbstractStyleManagerYaml.java +++ b/src/main/java/org/mastodon/app/ui/AbstractStyleManagerYaml.java @@ -5,6 +5,7 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.nio.file.Files; import java.util.ArrayList; import java.util.Set; import java.util.stream.Collectors; @@ -29,9 +30,8 @@ public void loadStyles( final String filename ) { userStyles.clear(); final Set< String > names = builtinStyles.stream().map( S::getName ).collect( Collectors.toSet() ); - try + try (final FileReader input = new FileReader( filename )) { - final FileReader input = new FileReader( filename ); final Iterable< Object > objs = createYaml().loadAll( input ); String defaultStyleName = null; @SuppressWarnings( "unchecked" ) @@ -71,8 +71,41 @@ else if ( klass.isInstance( obj ) ) { System.out.println( "Settings file " + filename + " not found. Using builtin settings." ); } + catch ( final IOException e1 ) + { + System.out.println( "Issues reading the settings file " + filename + ": " + e1.getMessage() ); + } } + /** + * Deal with possible legacy file. + *

+ * Loads from the file if it exists, appends to the current user styles, + * then deletes the legacy file. + * + * @param legacyFilePath + * the path to the legacy file. + */ + protected void handleLegacyFile( final String legacyFilePath ) + { + final File legacyFile = new File( legacyFilePath ); + if ( legacyFile.exists() ) + { + final ArrayList< S > currentStyles = new ArrayList<>( userStyles ); + loadStyles( legacyFilePath ); + userStyles.addAll( currentStyles ); + try + { + Files.delete( legacyFile.toPath() ); + } + catch ( final IOException e ) + { + System.err.println( "Could not delete the legacy settings file: " + legacyFilePath ); + e.printStackTrace(); + } + } + } + public void saveStyles( final String filename ) { try From 49ec3704c57e94264c48c44c6e950a5d2cec9f0e Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 8 Sep 2023 11:54:18 +0200 Subject: [PATCH 086/220] Add commonly useful lazy features. - Number of incoming and outgoing links on a spot. Useful to fish for cells that have a division or a merge, and debug unwanted linking events. - Oriented time-difference for links. Useful to detect buggy links introduced by improper semi-auto tracking. Debugging without this feature is really a pain. --- .../mamut/feature/LinkDeltaFrameFeature.java | 142 ++++++++++++++++++ .../mamut/feature/SpotNLinksFeature.java | 96 ++++++++++-- .../java/org/mastodon/mamut/model/Model.java | 8 +- 3 files changed, 233 insertions(+), 13 deletions(-) create mode 100644 src/main/java/org/mastodon/mamut/feature/LinkDeltaFrameFeature.java diff --git a/src/main/java/org/mastodon/mamut/feature/LinkDeltaFrameFeature.java b/src/main/java/org/mastodon/mamut/feature/LinkDeltaFrameFeature.java new file mode 100644 index 000000000..4d7dc8bfd --- /dev/null +++ b/src/main/java/org/mastodon/mamut/feature/LinkDeltaFrameFeature.java @@ -0,0 +1,142 @@ +/*- + * #%L + * Mastodon + * %% + * Copyright (C) 2014 - 2023 Tobias Pietzsch, Jean-Yves Tinevez + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ +package org.mastodon.mamut.feature; + +import static org.mastodon.feature.FeatureProjectionKey.key; + +import java.util.Collections; +import java.util.Set; + +import org.mastodon.feature.Dimension; +import org.mastodon.feature.Feature; +import org.mastodon.feature.FeatureProjection; +import org.mastodon.feature.FeatureProjectionKey; +import org.mastodon.feature.FeatureProjectionSpec; +import org.mastodon.feature.FeatureSpec; +import org.mastodon.feature.Multiplicity; +import org.mastodon.mamut.model.Link; +import org.mastodon.mamut.model.ModelGraph; +import org.mastodon.mamut.model.Spot; +import org.scijava.plugin.Plugin; + +public class LinkDeltaFrameFeature implements Feature< Link > +{ + + private static final String KEY = "Link delta T"; + + private static final String HELP_STRING = "The time difference in number of time-points between the target and source of links."; + + private static final FeatureProjectionSpec PROJECTION_SPEC = new FeatureProjectionSpec( KEY, Dimension.NONE ); + + public static final Spec SPEC = new Spec(); + + final ModelGraph graph; + + @Plugin( type = FeatureSpec.class ) + public static class Spec extends FeatureSpec< LinkDeltaFrameFeature, Link > + { + public Spec() + { + super( + KEY, + HELP_STRING, + LinkDeltaFrameFeature.class, + Link.class, + Multiplicity.SINGLE, + PROJECTION_SPEC ); + } + } + + public LinkDeltaFrameFeature( final ModelGraph graph ) + { + this.graph = graph; + } + + @Override + public FeatureProjection< Link > project( final FeatureProjectionKey key ) + { + return key( PROJECTION_SPEC ).equals( key ) ? new MyProjection( graph ) : null; + } + + @Override + public Set< FeatureProjection< Link > > projections() + { + return Collections.singleton( new MyProjection( graph ) ); + } + + @Override + public Spec getSpec() + { + return SPEC; + } + + @Override + public void invalidate( final Link link ) + {} + + private static final class MyProjection implements FeatureProjection< Link > + { + + private final Spot ref1; + + private final Spot ref2; + + public MyProjection( final ModelGraph graph ) + { + this.ref1 = graph.vertexRef(); + this.ref2 = graph.vertexRef(); + } + + @Override + public FeatureProjectionKey getKey() + { + return key( PROJECTION_SPEC ); + } + + @Override + public boolean isSet( final Link link ) + { + return true; + } + + @Override + public synchronized double value( final Link link ) + { + final Spot source = link.getSource( ref1 ); + final Spot target = link.getTarget( ref2 ); + return target.getTimepoint() - source.getTimepoint(); + } + + @Override + public String units() + { + return Dimension.NONE_UNITS; + } + } +} diff --git a/src/main/java/org/mastodon/mamut/feature/SpotNLinksFeature.java b/src/main/java/org/mastodon/mamut/feature/SpotNLinksFeature.java index 1f7488e76..454f4be3e 100644 --- a/src/main/java/org/mastodon/mamut/feature/SpotNLinksFeature.java +++ b/src/main/java/org/mastodon/mamut/feature/SpotNLinksFeature.java @@ -28,7 +28,9 @@ */ package org.mastodon.mamut.feature; +import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.Set; import org.mastodon.feature.Dimension; @@ -47,13 +49,21 @@ public class SpotNLinksFeature implements Feature< Spot > public static final String KEY = "Spot N links"; - private static final String HELP_STRING = "Computes the number of links that touch a spot."; + private static final String HELP_STRING = "Number of outgoing and incoming links of a spot."; - public static final FeatureProjectionSpec PROJECTION_SPEC = new FeatureProjectionSpec( KEY ); + public static final FeatureProjectionSpec N_LINKS_PROJECTION_SPEC = new FeatureProjectionSpec( KEY ); + + public static final FeatureProjectionSpec N_OUTGOING_LINKS_PROJECTION_SPEC = new FeatureProjectionSpec( "N outgoing links" ); + + public static final FeatureProjectionSpec N_INCOMING_LINKS_PROJECTION_SPEC = new FeatureProjectionSpec( "N incoming links" ); public static final Spec SPEC = new Spec(); - private final IntFeatureProjection< Spot > projection; + private final IntFeatureProjection< Spot > nLinksProjection; + + private final IntFeatureProjection< Spot > nIncomingLinksProjection; + + private final IntFeatureProjection< Spot > nOutgoingLinksProjection; @Plugin( type = FeatureSpec.class ) public static class Spec extends FeatureSpec< SpotNLinksFeature, Spot > @@ -66,25 +76,37 @@ public Spec() SpotNLinksFeature.class, Spot.class, Multiplicity.SINGLE, - PROJECTION_SPEC ); + N_LINKS_PROJECTION_SPEC, + N_OUTGOING_LINKS_PROJECTION_SPEC, + N_INCOMING_LINKS_PROJECTION_SPEC ); } } public SpotNLinksFeature() { - this.projection = new MyProjection(); + this.nLinksProjection = new NLinkProjection(); + this.nOutgoingLinksProjection = new NOutgoingLinkProjection(); + this.nIncomingLinksProjection = new NIncomingLinkProjection(); } @Override public FeatureProjection< Spot > project( final FeatureProjectionKey key ) { - return projection.getKey().equals( key ) ? projection : null; + if ( nLinksProjection.getKey().equals( key ) ) + return nLinksProjection; + else if ( nOutgoingLinksProjection.getKey().equals( key ) ) + return nOutgoingLinksProjection; + else if ( nIncomingLinksProjection.getKey().equals( key ) ) + return nIncomingLinksProjection; + else + return null; } @Override public Set< FeatureProjection< Spot > > projections() { - return Collections.singleton( projection ); + return Collections.unmodifiableSet( new HashSet<>( Arrays.asList( + nLinksProjection, nOutgoingLinksProjection, nIncomingLinksProjection ) ) ); } @Override @@ -97,13 +119,13 @@ public Spec getSpec() public void invalidate( final Spot spot ) {} - private static final class MyProjection implements IntFeatureProjection< Spot > + private static final class NLinkProjection implements IntFeatureProjection< Spot > { @Override public FeatureProjectionKey getKey() { - return FeatureProjectionKey.key( PROJECTION_SPEC ); + return FeatureProjectionKey.key( N_LINKS_PROJECTION_SPEC ); } @Override @@ -125,4 +147,60 @@ public String units() } } + + private static final class NOutgoingLinkProjection implements IntFeatureProjection< Spot > + { + + @Override + public FeatureProjectionKey getKey() + { + return FeatureProjectionKey.key( N_OUTGOING_LINKS_PROJECTION_SPEC ); + } + + @Override + public boolean isSet( final Spot obj ) + { + return true; + } + + @Override + public double value( final Spot obj ) + { + return obj.outgoingEdges().size(); + } + + @Override + public String units() + { + return Dimension.NONE_UNITS; + } + } + + private static final class NIncomingLinkProjection implements IntFeatureProjection< Spot > + { + + @Override + public FeatureProjectionKey getKey() + { + return FeatureProjectionKey.key( N_INCOMING_LINKS_PROJECTION_SPEC ); + } + + @Override + public boolean isSet( final Spot obj ) + { + return true; + } + + @Override + public double value( final Spot obj ) + { + return obj.incomingEdges().size(); + } + + @Override + public String units() + { + return Dimension.NONE_UNITS; + } + } } diff --git a/src/main/java/org/mastodon/mamut/model/Model.java b/src/main/java/org/mastodon/mamut/model/Model.java index 82459cee8..3cfd675f3 100644 --- a/src/main/java/org/mastodon/mamut/model/Model.java +++ b/src/main/java/org/mastodon/mamut/model/Model.java @@ -47,6 +47,7 @@ import org.mastodon.graph.io.RawGraphIO.FileIdToGraphMap; import org.mastodon.graph.io.RawGraphIO.GraphToFileIdMap; import org.mastodon.labels.LabelSets; +import org.mastodon.mamut.feature.LinkDeltaFrameFeature; import org.mastodon.mamut.feature.LinkDisplacementFeature; import org.mastodon.mamut.feature.LinkTargetIdFeature; import org.mastodon.mamut.feature.LinkVelocityFeature; @@ -195,10 +196,9 @@ public void declareDefaultFeatures() featureModel.declareFeature( new SpotFrameFeature() ); featureModel.declareFeature( new SpotNLinksFeature() ); featureModel.declareFeature( new LinkTargetIdFeature( modelGraph ) ); - featureModel.declareFeature( - new LinkDisplacementFeature( modelGraph, Dimension.LENGTH.getUnits( spaceUnits, timeUnits ) ) ); - featureModel.declareFeature( - new LinkVelocityFeature( modelGraph, Dimension.VELOCITY.getUnits( spaceUnits, timeUnits ) ) ); + featureModel.declareFeature( new LinkDisplacementFeature( modelGraph, Dimension.LENGTH.getUnits( spaceUnits, timeUnits ) ) ); + featureModel.declareFeature( new LinkVelocityFeature( modelGraph, Dimension.VELOCITY.getUnits( spaceUnits, timeUnits ) ) ); + featureModel.declareFeature( new LinkDeltaFrameFeature( modelGraph ) ); featureModel.declareFeature( new BranchNDivisionsFeature() ); } From dca0534c45ae8cb995fa328bbceaf2dfcf4c0b49 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Fri, 8 Sep 2023 12:36:00 +0200 Subject: [PATCH 087/220] Make sure the projections() method of feature is called only once, when creating the table header and collecting values. This is to protect against a bug that appear with features that are not careful to always return the same set of projections when the projections() method is called. This happend for the link target feature and generated the bug below: https://github.com/mastodon-sc/mastodon/issues/217 One can fix the bug by imposing the same order on features, but it is also a plus to make the table rendering independent of this order being preserved. --- .../views/table/FeatureTagTablePanel.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/mastodon/views/table/FeatureTagTablePanel.java b/src/main/java/org/mastodon/views/table/FeatureTagTablePanel.java index 59c07ccde..40d2dcaf0 100644 --- a/src/main/java/org/mastodon/views/table/FeatureTagTablePanel.java +++ b/src/main/java/org/mastodon/views/table/FeatureTagTablePanel.java @@ -43,8 +43,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.EventObject; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -403,19 +405,32 @@ private void refreshColumns() lastHeaderLine.add( "ID" ); columnClasses.add( Integer.class ); tableColumnModel.addColumn( new TableColumn( colIndex++ ) ); + + /* + * Store the map feature spect -> projection list, so that we don't have + * to call the projections() method several time. + */ + final Map< FeatureSpec< ?, ? >, List< FeatureProjection< ? > > > specToProjList = new HashMap<>(); + // Units for feature columns. for ( final FeatureSpec< ?, ? > fs : featureMap.keySet() ) { - final Feature< ? > feature = featureMap.get( fs ); - if ( null == feature.projections() ) + final String tooltip = "

" + fs.getInfo() + "

"; + @SuppressWarnings( "rawtypes" ) + final Feature feature = featureMap.get( fs ); + @SuppressWarnings( "unchecked" ) + final List< FeatureProjection< ? > > projections = ( feature.projections() == null ) + ? Collections.emptyList() + : new ArrayList<>( feature.projections() ); + specToProjList.put( fs, projections ); + if ( projections.isEmpty() ) continue; - final List< FeatureProjection< ? > > projections = new ArrayList<>( feature.projections() ); for ( final FeatureProjection< ? > projection : projections ) { @SuppressWarnings( "unchecked" ) final FeatureProjection< O > fp = ( FeatureProjection< O > ) projection; mapToProjections.add( fp ); - mapToTooltip.add( "

" + fs.getInfo() + "

" ); + mapToTooltip.add( tooltip ); final String units = fp.units(); lastHeaderLine.add( ( units == null || units.isEmpty() ) ? "" : "(" + units + ")" ); tableColumnModel.addColumn( new TableColumn( colIndex++ ) ); @@ -449,10 +464,9 @@ private void refreshColumns() { final ColumnGroup featureGroup = new ColumnGroup( fs.getKey() ); featureGroup.setHeaderRenderer( headerRenderer ); - final Feature< ? > feature = featureMap.get( fs ); - if ( null == feature.projections() ) + final List< FeatureProjection< ? > > projections = specToProjList.get( fs ); + if ( projections.isEmpty() ) continue; - final List< FeatureProjection< ? > > projections = new ArrayList<>( feature.projections() ); if ( projections.size() == 1 && projections.iterator().next().getKey().toString().equals( fs.getKey().toString() ) ) { final ColumnGroup projectionGroup = new ColumnGroup( " " ); From cc138364427e858beca8779ce39428da10ae3baf Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Sat, 14 Oct 2023 17:12:04 +0200 Subject: [PATCH 088/220] Update parent to pom-scijava v37.0.0 --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 357016b58..f0bf4edde 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.scijava pom-scijava - 35.1.1 + 37.0.0 org.mastodon @@ -48,10 +48,11 @@ bigdataviewer-core + From 869f60a8d917c946af82b5cab2067799c1a77862 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Sat, 14 Oct 2023 17:14:14 +0200 Subject: [PATCH 089/220] Depend on beta-25 for mastodon-collection and mastodon-graph. --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f0bf4edde..a5ecd130c 100644 --- a/pom.xml +++ b/pom.xml @@ -180,8 +180,8 @@ Mastodon authors Tobias Pietzsch, Jean-Yves Tinevez - 1.0.0-beta-24 - 1.0.0-beta-24 + 1.0.0-beta-25 + 1.0.0-beta-25 10.4.7 From cee3b9a8cea279abcc019d9ddbf815b47c0a675b Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Sat, 14 Oct 2023 17:17:26 +0200 Subject: [PATCH 090/220] Depend on bdv-core v10.4.8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a5ecd130c..e577ca167 100644 --- a/pom.xml +++ b/pom.xml @@ -182,7 +182,7 @@ 1.0.0-beta-25 1.0.0-beta-25 - 10.4.7 + 10.4.8 sign,deploy-to-scijava From d255a60d640911ee763bdbf67e2b310358cb97ce Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Sat, 14 Oct 2023 17:44:12 +0200 Subject: [PATCH 091/220] Remove opening of remote datasets (S3) for now. This feature relies oncode part of Mobie that have moved from there recently. It will need to be reimplemented, using the new changes in the N5 library (and friends) by the Saalfeld lab (and friends). Remote opening of BDV data on Big-Data-Servers still work. --- .../org/mastodon/mamut/io/ProjectActions.java | 2 - .../org/mastodon/mamut/io/ProjectCreator.java | 110 ------- .../mastodon/mamut/launcher/LauncherGUI.java | 5 - .../mamut/launcher/MastodonLauncher.java | 76 ----- .../mamut/launcher/OpenRemoteURLPanel.java | 300 ------------------ 5 files changed, 493 deletions(-) delete mode 100644 src/main/java/org/mastodon/mamut/launcher/OpenRemoteURLPanel.java diff --git a/src/main/java/org/mastodon/mamut/io/ProjectActions.java b/src/main/java/org/mastodon/mamut/io/ProjectActions.java index be1b2e585..c542a42cd 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectActions.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectActions.java @@ -60,12 +60,10 @@ public static void installGlobalActions( final Actions actions, final Context co { final BasicErrorLogger errorLogger = new BasicErrorLogger( parentComponent ); final RunnableAction createProjectAction = new RunnableAction( CREATE_PROJECT, () -> LauncherUtil.createProjectWithDialog( context, parentComponent, errorLogger ) ); - final RunnableAction createProjectFromUrlAction = new RunnableAction( CREATE_PROJECT_FROM_URL, () -> ProjectCreator.createProjectFromUrl( context, parentComponent, errorLogger ) ); final RunnableAction loadProjectAction = new RunnableAction( LOAD_PROJECT, () -> LauncherUtil.openWithDialog( context, parentComponent, errorLogger ) ); final RunnableAction importMamutAction = new RunnableAction( IMPORT_MAMUT, () -> ProjectImporter.openMamutWithDialog( parentComponent, context, errorLogger ) ); actions.namedAction( createProjectAction, CREATE_PROJECT_KEYS ); - actions.namedAction( createProjectFromUrlAction, CREATE_PROJECT_FROM_URL_KEYS ); actions.namedAction( loadProjectAction, LOAD_PROJECT_KEYS ); actions.namedAction( importMamutAction, IMPORT_MAMUT_KEYS ); } diff --git a/src/main/java/org/mastodon/mamut/io/ProjectCreator.java b/src/main/java/org/mastodon/mamut/io/ProjectCreator.java index cbce52f0e..f0e2fa0fa 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectCreator.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectCreator.java @@ -1,31 +1,15 @@ package org.mastodon.mamut.io; -import static org.mastodon.app.MastodonIcons.NEW_ICON_MEDIUM; - -import java.awt.Component; import java.io.File; import java.io.IOException; -import java.util.Arrays; -import java.util.function.Consumer; - -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPasswordField; -import javax.swing.JTextField; -import org.embl.mobie.io.ome.zarr.openers.OMEZarrS3Opener; -import org.embl.mobie.io.util.S3Utils; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.io.project.MamutProject; import org.mastodon.mamut.io.project.MamutProjectIO; -import org.mastodon.ui.util.FileChooser; -import org.mastodon.ui.util.XmlFileFilter; import org.scijava.Context; import ij.ImagePlus; -import mpicbg.spim.data.SpimData; import mpicbg.spim.data.SpimDataException; -import mpicbg.spim.data.XmlIoSpimData; /** * Static methods to create new Mastodon Mamut projects from images. @@ -59,100 +43,6 @@ public static ProjectModel createProjectFromBdvFile( final File file, final Cont return null; } - /** - * Interactively creates a new project from a remote file. - *

- * A dialog is shown to prompt the user for the URL of the image, then - * another one to resave the resulting BDV/XML file pointing to the remote - * URL. - * - * @param context - * the current context. - * @param parentComponent - * a component to use as parent to show dialogs during opening. - * Can be null. - * @param errorConsumer - * a consumer that will receive an user-readable error message if - * something wrong happens. - * @return a new {@link ProjectModel} or null if the user - * clicked cancel, or if the image data cannot be accessed. - */ - public static synchronized ProjectModel createProjectFromUrl( final Context context, final Component parentComponent, final Consumer< String > errorConsumer ) - { - final String urlString = JOptionPane.showInputDialog( parentComponent, "Please input a url for image data" ); - if ( urlString == null ) - return null; - - SpimData spimData = null; - try - { - spimData = OMEZarrS3Opener.readURL( urlString ); - } - catch ( final RuntimeException e ) - { - final JLabel lblUsername = new JLabel( "Username" ); - final JTextField textFieldUsername = new JTextField(); - final JLabel lblPassword = new JLabel( "Password" ); - final JPasswordField passwordField = new JPasswordField(); - final Object[] ob = { lblUsername, textFieldUsername, lblPassword, passwordField }; - final int result = - JOptionPane.showConfirmDialog( parentComponent, ob, "Please input credentials", JOptionPane.OK_CANCEL_OPTION ); - - if ( result == JOptionPane.OK_OPTION ) - { - final String username = textFieldUsername.getText(); - final char[] password = passwordField.getPassword(); - try - { - S3Utils.setS3AccessAndSecretKey( new String[] { username, new String( password ) } ); - } - finally - { - Arrays.fill( password, '0' ); - } - try - { - spimData = OMEZarrS3Opener.readURL( urlString ); - } - catch ( final Exception e1 ) - { - e1.printStackTrace(); - } - } - else - { - return null; - } - } - catch ( final Exception e ) - { - e.printStackTrace(); - } - - final File file = FileChooser.chooseFile( - parentComponent, - null, - new XmlFileFilter(), - "Save BigDataViewer File", - FileChooser.DialogType.SAVE, - NEW_ICON_MEDIUM.getImage() ); - if ( file == null ) - return null; - - final XmlIoSpimData xmlIoSpimData = new XmlIoSpimData(); - spimData.setBasePath( file.getParentFile() ); - try - { - xmlIoSpimData.save( spimData, file.getAbsolutePath() ); - return ProjectLoader.open( MamutProjectIO.fromBdvFile( file ), context ); - } - catch ( final IOException | SpimDataException e ) - { - e.printStackTrace(); - } - return null; - } - /** * Creates a new project from an {@link ImagePlus}. * diff --git a/src/main/java/org/mastodon/mamut/launcher/LauncherGUI.java b/src/main/java/org/mastodon/mamut/launcher/LauncherGUI.java index dc02fba30..b26a9b61b 100644 --- a/src/main/java/org/mastodon/mamut/launcher/LauncherGUI.java +++ b/src/main/java/org/mastodon/mamut/launcher/LauncherGUI.java @@ -102,8 +102,6 @@ class LauncherGUI extends JPanel final NewMastodonProjectPanel newMastodonProjectPanel; - final OpenRemoteURLPanel openRemoteURLPanel; - final LoggerPanel logger; final ImportTGMMPanel importTGMMPanel; @@ -213,9 +211,6 @@ public LauncherGUI( final Consumer< String > projectOpener ) recentProjectsPanel = new RecentProjectsPanel( projectOpener ); centralPanel.add( recentProjectsPanel, RECENT_PROJECTS_KEY ); - openRemoteURLPanel = new OpenRemoteURLPanel(); - centralPanel.add( openRemoteURLPanel, NEW_FROM_URL_KEY ); - importTGMMPanel = new ImportTGMMPanel(); centralPanel.add( importTGMMPanel, IMPORT_TGMM_KEY ); diff --git a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java index b7e4d8b6d..9a65f1309 100644 --- a/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java +++ b/src/main/java/org/mastodon/mamut/launcher/MastodonLauncher.java @@ -28,7 +28,6 @@ */ package org.mastodon.mamut.launcher; -import java.awt.Color; import java.awt.datatransfer.DataFlavor; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; @@ -73,9 +72,7 @@ import ij.ImagePlus; import ij.gui.ImageWindow; -import mpicbg.spim.data.SpimData; import mpicbg.spim.data.SpimDataException; -import mpicbg.spim.data.XmlIoSpimData; import mpicbg.spim.data.generic.AbstractSpimData; import mpicbg.spim.data.generic.sequence.AbstractSequenceDescription; import mpicbg.spim.data.registration.ViewRegistrations; @@ -118,7 +115,6 @@ public MastodonLauncher( final Context context ) gui.newMastodonProjectPanel.btnCreate.addActionListener( l -> createNewProject() ); gui.importTGMMPanel.btnImport.addActionListener( l -> importTgmm() ); gui.importSimiBioCellPanel.btnImport.addActionListener( l -> importSimi() ); - gui.openRemoteURLPanel.btnCreate.addActionListener( l -> createProjectFromURL() ); getContentPane().add( gui ); setSize( 630, 660 ); @@ -478,78 +474,6 @@ private void showHelpPanel() gui.showPanel( LauncherGUI.WELCOME_PANEL_KEY ); } - private void createProjectFromURL() - { - gui.clearLog(); - final String filepath = gui.openRemoteURLPanel.taFileSave.getText(); - if ( filepath == null || filepath.isEmpty() ) - { - gui.openRemoteURLPanel.log.setForeground( Color.RED ); - gui.openRemoteURLPanel.log.setText( "Please specify a BDV file to write to." ); - return; - } - - final File file = new File( filepath ); - if ( file.exists() && !file.canWrite() ) - { - gui.openRemoteURLPanel.log.setForeground( Color.RED ); - gui.openRemoteURLPanel.log.setText( "Target BDV file exists and cannot be overwritten." ); - return; - } - - final SpimData spimData = gui.openRemoteURLPanel.spimData; - if ( spimData == null ) - { - gui.openRemoteURLPanel.log.setForeground( Color.RED ); - gui.openRemoteURLPanel.log.setText( "Please specify an image URL first." ); - return; - } - - final EverythingDisablerAndReenabler disabler = - new EverythingDisablerAndReenabler( gui, new Class[] { JLabel.class } ); - disabler.disable(); - new Thread( () -> { - try - { - gui.openRemoteURLPanel.log.setText( "Creating project..." ); - - /* - * Save the XML file first. - */ - final XmlIoSpimData xmlIoSpimData = new XmlIoSpimData(); - spimData.setBasePath( file.getParentFile() ); - try - { - xmlIoSpimData.save( spimData, file.getAbsolutePath() ); - } - catch ( final SpimDataException e ) - { - gui.openRemoteURLPanel.log.setForeground( Color.RED ); - gui.openRemoteURLPanel.log.setText( "Problem save to BDV file.

" + - e.getMessage() + "" ); - } - - /* - * Open it as a new Mastodon project. - */ - final ProjectModel appModel = LauncherUtil.createProjectFromBdvFileWithDialog( file, context, gui, gui::error ); - new MainWindow( appModel ).setVisible( true ); - - /* - * We update the list of recent projects here so that only - * projects that were successfully opened are added to the list. - */ - RecentProjectsPanel.recentProjects.add( file.getAbsolutePath() ); - - dispose(); - } - finally - { - disabler.reenable(); - } - } ).start(); - } - private void importMaMuT() { final EverythingDisablerAndReenabler disabler = diff --git a/src/main/java/org/mastodon/mamut/launcher/OpenRemoteURLPanel.java b/src/main/java/org/mastodon/mamut/launcher/OpenRemoteURLPanel.java deleted file mode 100644 index 8faab1ec6..000000000 --- a/src/main/java/org/mastodon/mamut/launcher/OpenRemoteURLPanel.java +++ /dev/null @@ -1,300 +0,0 @@ -/*- - * #%L - * Mastodon - * %% - * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ -package org.mastodon.mamut.launcher; - -import java.awt.Color; -import java.awt.Font; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Arrays; - -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.SwingConstants; - -import org.embl.mobie.io.ome.zarr.openers.OMEZarrS3Opener; -import org.embl.mobie.io.util.S3Utils; -import org.mastodon.ui.util.EverythingDisablerAndReenabler; -import org.mastodon.ui.util.FileChooser; -import org.mastodon.ui.util.XmlFileFilter; - -import mpicbg.spim.data.SpimData; - -public class OpenRemoteURLPanel extends JPanel -{ - - private static final long serialVersionUID = 1L; - - SpimData spimData; - - final JLabel log; - - final JTextArea taFileSave; - - final JButton btnCreate; - - public OpenRemoteURLPanel() - { - final GridBagLayout gridBagLayout = new GridBagLayout(); - gridBagLayout.columnWidths = new int[] { 90, 0, 0 }; - gridBagLayout.rowHeights = new int[] { 35, 70, 65, 0, 50, 65, 0, 0, 0, 0 }; - gridBagLayout.columnWeights = new double[] { 0.0, 1.0, Double.MIN_VALUE }; - gridBagLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, Double.MIN_VALUE }; - setLayout( gridBagLayout ); - - final JLabel lblTitle = new JLabel( "Open a remote image" ); - lblTitle.setFont( lblTitle.getFont().deriveFont( lblTitle.getFont().getStyle() | Font.BOLD ) ); - lblTitle.setHorizontalAlignment( SwingConstants.CENTER ); - final GridBagConstraints gbcLblTitle = new GridBagConstraints(); - gbcLblTitle.gridwidth = 2; - gbcLblTitle.insets = new Insets( 5, 5, 5, 5 ); - gbcLblTitle.fill = GridBagConstraints.HORIZONTAL; - gbcLblTitle.gridx = 0; - gbcLblTitle.gridy = 0; - add( lblTitle, gbcLblTitle ); - - final JLabel lblImgUrl = new JLabel( "Image URL:" ); - final GridBagConstraints gbcLblImgUrl = new GridBagConstraints(); - gbcLblImgUrl.anchor = GridBagConstraints.SOUTHWEST; - gbcLblImgUrl.gridwidth = 2; - gbcLblImgUrl.insets = new Insets( 5, 5, 5, 5 ); - gbcLblImgUrl.gridx = 0; - gbcLblImgUrl.gridy = 1; - add( lblImgUrl, gbcLblImgUrl ); - - final JTextArea taURL = new JTextArea(); - taURL.setLineWrap( true ); - final GridBagConstraints gbcTextArea = new GridBagConstraints(); - gbcTextArea.gridwidth = 2; - gbcTextArea.insets = new Insets( 5, 5, 5, 5 ); - gbcTextArea.fill = GridBagConstraints.BOTH; - gbcTextArea.gridx = 0; - gbcTextArea.gridy = 2; - add( taURL, gbcTextArea ); - - final JButton btnOpen = new JButton( "open" ); - final GridBagConstraints gbcBtnOpen = new GridBagConstraints(); - gbcBtnOpen.anchor = GridBagConstraints.EAST; - gbcBtnOpen.insets = new Insets( 5, 5, 5, 5 ); - gbcBtnOpen.gridx = 1; - gbcBtnOpen.gridy = 3; - add( btnOpen, gbcBtnOpen ); - - final JLabel lblResave = new JLabel( "Resave BDV file to:" ); - final GridBagConstraints gbcLblResave = new GridBagConstraints(); - gbcLblResave.insets = new Insets( 5, 5, 5, 5 ); - gbcLblResave.anchor = GridBagConstraints.SOUTHWEST; - gbcLblResave.gridwidth = 2; - gbcLblResave.gridx = 0; - gbcLblResave.gridy = 4; - add( lblResave, gbcLblResave ); - - taFileSave = new JTextArea(); - taFileSave.setLineWrap( true ); - final GridBagConstraints gbcTAFileSave = new GridBagConstraints(); - gbcTAFileSave.gridwidth = 2; - gbcTAFileSave.insets = new Insets( 5, 5, 5, 5 ); - gbcTAFileSave.fill = GridBagConstraints.BOTH; - gbcTAFileSave.gridx = 0; - gbcTAFileSave.gridy = 5; - add( taFileSave, gbcTAFileSave ); - - final JButton btnBrowse = new JButton( "browse" ); - final GridBagConstraints gbcBtnBrowse = new GridBagConstraints(); - gbcBtnBrowse.insets = new Insets( 5, 5, 5, 5 ); - gbcBtnBrowse.anchor = GridBagConstraints.EAST; - gbcBtnBrowse.gridx = 1; - gbcBtnBrowse.gridy = 6; - add( btnBrowse, gbcBtnBrowse ); - - log = new JLabel( " " ); - log.setFont( log.getFont().deriveFont( log.getFont().getStyle() | Font.ITALIC ) ); - final GridBagConstraints gbcLbLog = new GridBagConstraints(); - gbcLbLog.fill = GridBagConstraints.BOTH; - gbcLbLog.insets = new Insets( 5, 5, 5, 5 ); - gbcLbLog.gridwidth = 2; - gbcLbLog.gridx = 0; - gbcLbLog.gridy = 7; - add( log, gbcLbLog ); - - btnCreate = new JButton( "create" ); - final GridBagConstraints gbcBtnCreate = new GridBagConstraints(); - gbcBtnCreate.gridwidth = 2; - gbcBtnCreate.anchor = GridBagConstraints.SOUTHEAST; - gbcBtnCreate.gridx = 0; - gbcBtnCreate.gridy = 8; - add( btnCreate, gbcBtnCreate ); - - /* - * Wire listeners. - */ - - btnOpen.addActionListener( l -> parseURL( taURL.getText() ) ); - LauncherUtil.decorateJComponent( taURL, () -> parseURL( taURL.getText() ) ); - btnBrowse.addActionListener( l -> browseSaveToBDVFile( - null, - taFileSave, - () -> {}, - this ) ); - LauncherUtil.decorateJComponent( taFileSave, () -> {} ); - } - - private void parseURL( final String urlString ) - { - spimData = null; - if ( urlString == null || urlString.isEmpty() ) - { - log.setForeground( Color.RED.darker() ); - log.setText( "Please enter a URL pointing to an image." ); - return; - } - - // Check that we have a reachable URL. - try - { - new URL( urlString ); - } - catch ( final MalformedURLException e2 ) - { - log.setForeground( Color.RED.darker() ); - log.setText( "Malformed URL." + e2.getMessage() ); - return; - } - - final EverythingDisablerAndReenabler disabler = - new EverythingDisablerAndReenabler( this, new Class[] { JLabel.class } ); - disabler.disable(); - new Thread() - { - @Override - public void run() - { - try - { - log.setForeground( Color.BLUE.darker() ); - log.setText( "Inspecting image URL..." ); - spimData = OMEZarrS3Opener.readURL( urlString ); - final String str = LauncherUtil.buildInfoString( spimData ); - log.setForeground( Color.BLACK ); - log.setText( str ); - } - catch ( final RuntimeException e ) - { - log.setForeground( Color.BLUE.darker() ); - log.setText( "Image access requires credentials." ); - - final JLabel lblUsername = new JLabel( "Username" ); - final JTextField textFieldUsername = new JTextField(); - final JLabel lblPassword = new JLabel( "Password" ); - final JPasswordField passwordField = new JPasswordField(); - final Object[] ob = { lblUsername, textFieldUsername, lblPassword, passwordField }; - final int result = JOptionPane.showConfirmDialog( null, ob, "Please input credentials", - JOptionPane.OK_CANCEL_OPTION ); - - if ( result == JOptionPane.OK_OPTION ) - { - final String username = textFieldUsername.getText(); - final char[] password = passwordField.getPassword(); - try - { - S3Utils.setS3AccessAndSecretKey( new String[] { username, new String( password ) } ); - } - finally - { - Arrays.fill( password, '0' ); - } - try - { - spimData = OMEZarrS3Opener.readURL( urlString ); - final String str = LauncherUtil.buildInfoString( spimData ); - log.setForeground( Color.BLACK ); - log.setText( str ); - } - catch ( final Exception e1 ) - { - log.setForeground( Color.RED.darker() ); - log.setText( "Error opening remote image with credentials:\n" + e1.getMessage() ); - } - } - else - { - log.setForeground( Color.RED.darker() ); - log.setText( "Please enter username and password." ); - return; - } - } - catch ( final Exception e ) - { - log.setForeground( Color.RED.darker() ); - log.setText( "Error opening remote image:\n" + e.getMessage() ); - } - finally - { - disabler.reenable(); - } - }; - }.start(); - } - - private static final void browseSaveToBDVFile( final String suggestedFile, final JTextArea target, - final Runnable onSucess, final JComponent parent ) - { - final EverythingDisablerAndReenabler disabler = - new EverythingDisablerAndReenabler( parent, new Class[] { JLabel.class } ); - disabler.disable(); - try - { - final File file = FileChooser.chooseFile( - parent, - suggestedFile, - new XmlFileFilter(), - "Save to a BigDataViewer File", - FileChooser.DialogType.SAVE ); - if ( file == null ) - return; - - target.setText( file.getAbsolutePath() ); - onSucess.run(); - } - finally - { - disabler.reenable(); - } - } -} From 3b124ee159331637077c933394cda3272036b69a Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Sat, 14 Oct 2023 17:44:28 +0200 Subject: [PATCH 092/220] Fix bogus import of Font from itext. --- .../org/mastodon/feature/ui/FeatureColorModeEditorPanel.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/mastodon/feature/ui/FeatureColorModeEditorPanel.java b/src/main/java/org/mastodon/feature/ui/FeatureColorModeEditorPanel.java index e899596b2..ec534f445 100644 --- a/src/main/java/org/mastodon/feature/ui/FeatureColorModeEditorPanel.java +++ b/src/main/java/org/mastodon/feature/ui/FeatureColorModeEditorPanel.java @@ -31,6 +31,7 @@ import java.awt.Component; import java.awt.Container; import java.awt.Dimension; +import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; @@ -53,8 +54,6 @@ import org.mastodon.ui.coloring.feature.FeatureProjectionId; import org.mastodon.ui.coloring.feature.FeatureRangeCalculator; -import com.itextpdf.text.Font; - /** * JPanel to edit a single {@link FeatureColorMode}. * From 16ae072d6b33b8dfe3ae464c142b74636bbc3bd8 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Sat, 14 Oct 2023 18:06:08 +0200 Subject: [PATCH 093/220] Cleanup pom.xml. - Remove dep imagej-legacy - It generated errors with the legacy injector when trying to run Mastodon from Eclipse. - Remove mobie-io, jackson-core - We have to re-engineer N5 and S3 support. - Remove scijava-common, IO_ - Needed for DnD support, which needs to be rewritten as well. - Remove custom specification of bdv-core - It was ignored anyway and we now rely on the parent ponm specification. --- pom.xml | 40 ++++++---------------------------------- 1 file changed, 6 insertions(+), 34 deletions(-) diff --git a/pom.xml b/pom.xml index e577ca167..1224f4804 100644 --- a/pom.xml +++ b/pom.xml @@ -42,23 +42,19 @@ ${mastodon-graph.version} - + sc.fiji bigdataviewer-core - - - - sc.fiji bigdataviewer-vistools + + sc.fiji + bigdataviewer_fiji + sc.fiji spim_data @@ -81,18 +77,7 @@ net.imglib2 imglib2-roi - - - - org.embl.mobie - mobie-io - 2.0.7 - - - com.fasterxml.jackson.core - jackson-core - - + com.opencsv @@ -103,18 +88,6 @@ humble-video-all - - - - org.scijava - scijava-common - - - - sc.fiji - IO_ - - junit @@ -182,7 +155,6 @@ 1.0.0-beta-25 1.0.0-beta-25 - 10.4.8 sign,deploy-to-scijava From 7c8d261e06ad8eb0ca4ab9400449608b26853c7c Mon Sep 17 00:00:00 2001 From: Ko Sugawara Date: Sat, 14 Oct 2023 04:37:09 +0900 Subject: [PATCH 094/220] Make WindowsManager.getViewList( final Class< T > klass ) public It is helpful if a plugin has access to a list of views. Use case: https://github.com/elephant-track/elephant-client/blob/951a2c60115d30d9debae453436ddfbd40ac8042/src/main/java/org/elephant/actions/mixins/WindowManagerMixin.java#L55 --- src/main/java/org/mastodon/mamut/WindowManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 503237beb..971e9b901 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -420,7 +420,7 @@ public < T > T getManager( final Class< T > klass ) * the view class, must extend {@link MamutViewI}. * @return the list of view of specified class, or null. */ - private < T extends MamutViewI > List< T > getViewList( final Class< T > klass ) + public < T extends MamutViewI > List< T > getViewList( final Class< T > klass ) { @SuppressWarnings( "unchecked" ) final List< T > list = ( List< T > ) openedViews.get( klass ); From 42004a165c13dc1140d82b71126c1aad80fadb82 Mon Sep 17 00:00:00 2001 From: Jean-Yves Tinevez Date: Sat, 14 Oct 2023 18:24:10 +0200 Subject: [PATCH 095/220] Don't let a piublic method mofify the state of the window manager. The purpose of the getViewList() method now changed. It is meant to be used by 3rd party consumers, not by the internal logic. --- .../java/org/mastodon/mamut/WindowManager.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/mastodon/mamut/WindowManager.java b/src/main/java/org/mastodon/mamut/WindowManager.java index 971e9b901..65bee2bfd 100644 --- a/src/main/java/org/mastodon/mamut/WindowManager.java +++ b/src/main/java/org/mastodon/mamut/WindowManager.java @@ -314,7 +314,7 @@ public synchronized < T extends MamutViewI > T createView( final Class< T > klas // Register close listener. view.onClose( () -> { // Remove view from list of opened views. - getViewList( klass ).remove( view ); + openedViews.get( klass ).remove( view ); if ( view instanceof HasContextChooser ) { @@ -411,20 +411,23 @@ public < T > T getManager( final Class< T > klass ) } /** - * Returns the list of opened mamut views of the specified type, or - * null if a view of this type is not registered. + * Returns the list of opened mamut views of the specified type. The list + * can be empty if a view of this type is not registered, but is never + * null. * * @param * the view type, must extend {@link MamutViewI}. * @param klass * the view class, must extend {@link MamutViewI}. - * @return the list of view of specified class, or null. + * @return a new, unmodified list of view of specified class. */ public < T extends MamutViewI > List< T > getViewList( final Class< T > klass ) { @SuppressWarnings( "unchecked" ) final List< T > list = ( List< T > ) openedViews.get( klass ); - return list; + if ( list == null ) + return Collections.emptyList(); + return Collections.unmodifiableList( list ); } /** @@ -438,11 +441,12 @@ public < T extends MamutViewI > List< T > getViewList( final Class< T > klass ) * @param * the type of the view to operate on. */ + @SuppressWarnings( "unchecked" ) public < T extends MamutViewI > void forEachView( final Class< T > klass, final Consumer< T > action ) { - Optional.ofNullable( getViewList( klass ) ) + Optional.ofNullable( openedViews.get( klass ) ) .orElse( Collections.emptyList() ) - .forEach( action ); + .forEach( ( Consumer< ? super MamutViewI > ) action ); } /** From a1962bfdb182047b3ec4a6f0f11b3347d8a00d08 Mon Sep 17 00:00:00 2001 From: Ko Sugawara Date: Sat, 18 Nov 2023 22:32:41 +0900 Subject: [PATCH 096/220] Add n5-universe --- .vscode/launch.json | 283 ++++++++++ .vscode/settings.json | 4 + imglib2-coding-style.xml | 399 ++++++++++++++ pom.xml | 6 + .../org/mastodon/mamut/io/ProjectSaver.java | 65 ++- .../mamut/io/loader/BdvN5UniverseFormat.java | 194 +++++++ .../mamut/io/loader/N5UniverseImgLoader.java | 489 ++++++++++++++++++ .../io/loader/XmlIoN5UniverseImgLoader.java | 97 ++++ .../launcher/NewMastodonProjectPanel.java | 2 +- .../mastodon/ui/util/CombinedFileFilter.java | 44 ++ .../org/mastodon/ui/util/HDF5FileFilter.java | 37 ++ src/test/java/N5Tutorial.java | 66 +++ .../org/mastodon/StartMastodonLauncher.java | 4 + .../org/mastodon/StartMastodonOnProject.java | 9 +- .../mamut/io/loader/mito_s3_omezarr copy.xml | 68 +++ .../mamut/io/loader/mito_s3_omezarr.xml | 68 +++ .../io/loader/mitosis_small.ome.zarr/.zattrs | 3 + .../io/loader/mitosis_small.ome.zarr/.zgroup | 3 + .../loader/mitosis_small.ome.zarr/0/.zattrs | 70 +++ .../loader/mitosis_small.ome.zarr/0/.zgroup | 3 + .../loader/mitosis_small.ome.zarr/0/0/.zarray | 17 + .../mitosis_small.ome.zarr/0/0/0/0/0/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/0/0/1/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/0/0/2/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/0/0/3/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/0/0/4/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/0/1/0/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/0/1/1/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/0/1/2/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/0/1/3/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/0/1/4/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/1/0/0/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/1/0/1/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/1/0/2/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/1/0/3/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/1/0/4/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/1/1/0/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/1/1/1/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/1/1/2/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/1/1/3/0/0 | Bin 0 -> 67048 bytes .../mitosis_small.ome.zarr/0/0/1/1/4/0/0 | Bin 0 -> 67048 bytes .../loader/mitosis_small.ome.zarr/OME/.zattrs | 3 + .../loader/mitosis_small.ome.zarr/OME/.zgroup | 3 + .../OME/METADATA.ome.xml | 182 +++++++ .../mamut/io/loader/mitosis_small_hdf5.h5 | Bin 0 -> 1092663 bytes .../mamut/io/loader/mitosis_small_hdf5.xml | 72 +++ .../mitosis_small_n5.n5/attributes.json | 1 + .../setup0/attributes.json | 1 + .../setup0/timepoint0/attributes.json | 1 + .../setup0/timepoint0/s0/0/0/0 | Bin 0 -> 173646 bytes .../setup0/timepoint0/s0/0/1/0 | Bin 0 -> 90139 bytes .../setup0/timepoint0/s0/attributes.json | 1 + .../setup0/timepoint1/attributes.json | 1 + .../setup0/timepoint1/s0/0/0/0 | Bin 0 -> 173179 bytes .../setup0/timepoint1/s0/0/1/0 | Bin 0 -> 89738 bytes .../setup0/timepoint1/s0/attributes.json | 1 + .../setup1/attributes.json | 1 + .../setup1/timepoint0/attributes.json | 1 + .../setup1/timepoint0/s0/0/0/0 | Bin 0 -> 183815 bytes .../setup1/timepoint0/s0/0/1/0 | Bin 0 -> 95331 bytes .../setup1/timepoint0/s0/attributes.json | 1 + .../setup1/timepoint1/attributes.json | 1 + .../setup1/timepoint1/s0/0/0/0 | Bin 0 -> 183434 bytes .../setup1/timepoint1/s0/0/1/0 | Bin 0 -> 95456 bytes .../setup1/timepoint1/s0/attributes.json | 1 + .../mamut/io/loader/mitosis_small_n5.xml | 72 +++ .../mamut/io/loader/mitosis_small_omezarr.xml | 72 +++ 67 files changed, 2323 insertions(+), 23 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 imglib2-coding-style.xml create mode 100644 src/main/java/org/mastodon/mamut/io/loader/BdvN5UniverseFormat.java create mode 100644 src/main/java/org/mastodon/mamut/io/loader/N5UniverseImgLoader.java create mode 100644 src/main/java/org/mastodon/mamut/io/loader/XmlIoN5UniverseImgLoader.java create mode 100644 src/main/java/org/mastodon/ui/util/CombinedFileFilter.java create mode 100644 src/main/java/org/mastodon/ui/util/HDF5FileFilter.java create mode 100644 src/test/java/N5Tutorial.java create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mito_s3_omezarr copy.xml create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mito_s3_omezarr.xml create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/.zattrs create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/.zgroup create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/.zattrs create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/.zgroup create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/.zarray create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/0/0/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/0/1/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/0/2/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/0/3/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/0/4/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/1/0/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/1/1/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/1/2/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/1/3/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/1/4/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/0/0/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/0/1/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/0/2/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/0/3/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/0/4/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/1/0/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/1/1/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/1/2/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/1/3/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/1/4/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/OME/.zattrs create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/OME/.zgroup create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/OME/METADATA.ome.xml create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_hdf5.h5 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_hdf5.xml create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/attributes.json create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/attributes.json create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/timepoint0/attributes.json create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/timepoint0/s0/0/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/timepoint0/s0/0/1/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/timepoint0/s0/attributes.json create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/timepoint1/attributes.json create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/timepoint1/s0/0/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/timepoint1/s0/0/1/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/timepoint1/s0/attributes.json create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup1/attributes.json create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup1/timepoint0/attributes.json create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup1/timepoint0/s0/0/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup1/timepoint0/s0/0/1/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup1/timepoint0/s0/attributes.json create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup1/timepoint1/attributes.json create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup1/timepoint1/s0/0/0/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup1/timepoint1/s0/0/1/0 create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup1/timepoint1/s0/attributes.json create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.xml create mode 100644 src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_omezarr.xml diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..461e4e6d1 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,283 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Current File", + "request": "launch", + "mainClass": "${file}" + }, + { + "type": "java", + "name": "N5Tutorial", + "request": "launch", + "mainClass": "N5Tutorial", + "projectName": "mastodon", + "vmArgs": "-Djna.library.path=/opt/homebrew/Cellar/c-blosc/1.21.5/lib" + }, + { + "type": "java", + "name": "StartImageJ", + "request": "launch", + "mainClass": "org.mastodon.StartImageJ", + "projectName": "mastodon", + "vmArgs": "-Djna.library.path=/opt/homebrew/Cellar/c-blosc/1.21.5/lib" + }, + { + "type": "java", + "name": "StartMastodonDefaultProject", + "request": "launch", + "mainClass": "org.mastodon.StartMastodonDefaultProject", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "StartMastodonLauncher", + "request": "launch", + "mainClass": "org.mastodon.StartMastodonLauncher", + "projectName": "mastodon", + "vmArgs": "-Djna.library.path=/opt/homebrew/Cellar/c-blosc/1.21.5/lib" + }, + { + "type": "java", + "name": "StartMastodonOnProject", + "request": "launch", + "mainClass": "org.mastodon.StartMastodonOnProject", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "SettingsPanelExample", + "request": "launch", + "mainClass": "org.mastodon.app.ui.settings.SettingsPanelExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "FeatureDiscoveryExample", + "request": "launch", + "mainClass": "org.mastodon.feature.FeatureDiscoveryExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "BranchGraphExample", + "request": "launch", + "mainClass": "org.mastodon.graph.BranchGraphExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "CreateLargeModelExample", + "request": "launch", + "mainClass": "org.mastodon.graph.revised.CreateLargeModelExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "PropertyMapBenchmark", + "request": "launch", + "mainClass": "org.mastodon.graph.revised.PropertyMapBenchmark", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "GarbageCollectionDemo", + "request": "launch", + "mainClass": "org.mastodon.mamut.GarbageCollectionDemo", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "MamutPlayground", + "request": "launch", + "mainClass": "org.mastodon.mamut.MamutPlayground", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "StartMastodonWithMissingImageDemo", + "request": "launch", + "mainClass": "org.mastodon.mamut.StartMastodonWithMissingImageDemo", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "EllpsoidIteratorExample", + "request": "launch", + "mainClass": "org.mastodon.mamut.feature.EllpsoidIteratorExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "EllpsoidIteratorMinimalExample", + "request": "launch", + "mainClass": "org.mastodon.mamut.feature.EllpsoidIteratorMinimalExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "RawDeserializationExample", + "request": "launch", + "mainClass": "org.mastodon.mamut.feature.RawDeserializationExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "SerializeFeatureExample", + "request": "launch", + "mainClass": "org.mastodon.mamut.feature.SerializeFeatureExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "SpotIntensityBenchmark", + "request": "launch", + "mainClass": "org.mastodon.mamut.feature.SpotIntensityBenchmark", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "SpotIntensityUpdateExample", + "request": "launch", + "mainClass": "org.mastodon.mamut.feature.SpotIntensityUpdateExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "FeatureColorModeConfigPageDemo", + "request": "launch", + "mainClass": "org.mastodon.mamut.feature.ui.FeatureColorModeConfigPageDemo", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "FeatureTableDialogExample", + "request": "launch", + "mainClass": "org.mastodon.mamut.feature.ui.FeatureTableDialogExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "MaMuTExportExample", + "request": "launch", + "mainClass": "org.mastodon.mamut.io.importer.MaMuTExportExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "MaMuTImporterExample", + "request": "launch", + "mainClass": "org.mastodon.mamut.io.importer.MaMuTImporterExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "TgmmImporter", + "request": "launch", + "mainClass": "org.mastodon.mamut.io.importer.tgmm.TgmmImporter", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "MamutProjectIO", + "request": "launch", + "mainClass": "org.mastodon.mamut.io.project.MamutProjectIO", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "MastodonLauncherCommand", + "request": "launch", + "mainClass": "org.mastodon.mamut.launcher.MastodonLauncherCommand", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "PlayingWithTagsExample", + "request": "launch", + "mainClass": "org.mastodon.mamut.tags.PlayingWithTagsExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "ColorTagTableDialogExample", + "request": "launch", + "mainClass": "org.mastodon.model.tag.ui.ColorTagTableDialogExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "TagSetDialog", + "request": "launch", + "mainClass": "org.mastodon.model.tag.ui.TagSetDialog", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "TagTableDialogExample", + "request": "launch", + "mainClass": "org.mastodon.model.tag.ui.TagTableDialogExample", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "FeatureColorMode", + "request": "launch", + "mainClass": "org.mastodon.ui.coloring.feature.FeatureColorMode", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "KeymapSettingsPage", + "request": "launch", + "mainClass": "org.mastodon.ui.keymap.KeymapSettingsPage", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "RenderSettingsConfigPage", + "request": "launch", + "mainClass": "org.mastodon.views.bdv.overlay.ui.RenderSettingsConfigPage", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "GrapherSidePanel", + "request": "launch", + "mainClass": "org.mastodon.views.grapher.display.GrapherSidePanel", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "DataDisplayStyleEditorPanel", + "request": "launch", + "mainClass": "org.mastodon.views.grapher.display.style.DataDisplayStyleEditorPanel", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "DataDisplayStyleSettingsPage", + "request": "launch", + "mainClass": "org.mastodon.views.grapher.display.style.DataDisplayStyleSettingsPage", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "TrackSchemeStyleEditorPanel", + "request": "launch", + "mainClass": "org.mastodon.views.trackscheme.display.style.TrackSchemeStyleEditorPanel", + "projectName": "mastodon" + }, + { + "type": "java", + "name": "TrackSchemeStyleSettingsPage", + "request": "launch", + "mainClass": "org.mastodon.views.trackscheme.display.style.TrackSchemeStyleSettingsPage", + "projectName": "mastodon" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..1f7089db6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive", + "java.format.settings.url": "imglib2-coding-style.xml" +} \ No newline at end of file diff --git a/imglib2-coding-style.xml b/imglib2-coding-style.xml new file mode 100644 index 000000000..f90331e57 --- /dev/null +++ b/imglib2-coding-style.xml @@ -0,0 +1,399 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 1224f4804..6aa79dcd7 100644 --- a/pom.xml +++ b/pom.xml @@ -77,6 +77,12 @@ net.imglib2 imglib2-roi + + + + org.janelia.saalfeldlab + n5-universe + diff --git a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java index f1ae61fec..eb6c6a28d 100644 --- a/src/main/java/org/mastodon/mamut/io/ProjectSaver.java +++ b/src/main/java/org/mastodon/mamut/io/ProjectSaver.java @@ -7,6 +7,7 @@ import static org.mastodon.mamut.io.project.MamutProjectIO.MAMUTPROJECT_VERSION_ATTRIBUTE_NAME; import java.awt.Component; +import java.awt.EventQueue; import java.awt.event.WindowAdapter; import java.awt.event.WindowListener; import java.io.File; @@ -128,25 +129,51 @@ public void run() * a ref to what we will receive; we use a StringBuilder for that. */ final StringBuilder str = new StringBuilder(); - SwingUtilities.invokeAndWait( new Runnable() + if ( EventQueue.isDispatchThread() ) { + new Runnable() + { + @Override + public void run() + { + final File file = FileChooser.chooseFile( true, + parentComponent, + projectRoot, + new ExtensionFileFilter( "mastodon" ), + "Save Mastodon Project", + FileChooser.DialogType.SAVE, + SelectionMode.FILES_ONLY, + SAVE_ICON_MEDIUM.getImage() ); + if ( file == null ) + return; + str.append( file.getAbsolutePath() ); + } - @Override - public void run() + }.run(); + } + else + { + SwingUtilities.invokeAndWait( new Runnable() { - final File file = FileChooser.chooseFile( true, - parentComponent, - projectRoot, - new ExtensionFileFilter( "mastodon" ), - "Save Mastodon Project", - FileChooser.DialogType.SAVE, - SelectionMode.FILES_ONLY, - SAVE_ICON_MEDIUM.getImage() ); - if ( file == null ) - return; - str.append( file.getAbsolutePath() ); - } - } ); + + @Override + public void run() + { + final File file = FileChooser.chooseFile( true, + parentComponent, + projectRoot, + new ExtensionFileFilter( "mastodon" ), + "Save Mastodon Project", + FileChooser.DialogType.SAVE, + SelectionMode.FILES_ONLY, + SAVE_ICON_MEDIUM.getImage() ); + if ( file == null ) + return; + str.append( file.getAbsolutePath() ); + } + } ); + } + if ( str.length() == 0 ) // Abort return; @@ -230,7 +257,7 @@ public static synchronized void saveProject( final File saveTo, final ProjectMod // Possibly update project root. project.setProjectRoot( saveTo ); - try (final MamutProject.ProjectWriter writer = project.openForWriting()) + try ( final MamutProject.ProjectWriter writer = project.openForWriting() ) { MamutProjectIO.save( project, writer ); final Model model = appModel.getModel(); @@ -295,7 +322,7 @@ private static void saveGUI( final ProjectWriter writer, final WindowManager win guiRoot.addContent( windows ); final Document doc = new Document( guiRoot ); final XMLOutputter xout = new XMLOutputter( Format.getPrettyFormat() ); - try (OutputStream outputStream = writer.getGuiOutputStream()) + try ( OutputStream outputStream = writer.getGuiOutputStream() ) { xout.output( doc, outputStream ); } @@ -313,7 +340,7 @@ private static void saveBackupDatasetXml( final File tmpDatasetXml, final Projec if ( tmpDatasetXml == null ) return; - try (OutputStream out = projectWriter.getBackupDatasetXmlOutputStream()) + try ( OutputStream out = projectWriter.getBackupDatasetXmlOutputStream() ) { Files.copy( tmpDatasetXml.toPath(), out ); } diff --git a/src/main/java/org/mastodon/mamut/io/loader/BdvN5UniverseFormat.java b/src/main/java/org/mastodon/mamut/io/loader/BdvN5UniverseFormat.java new file mode 100644 index 000000000..55fc9835e --- /dev/null +++ b/src/main/java/org/mastodon/mamut/io/loader/BdvN5UniverseFormat.java @@ -0,0 +1,194 @@ +package org.mastodon.mamut.io.loader; + +import java.io.IOException; + +import org.janelia.saalfeldlab.n5.DataType; +import org.janelia.saalfeldlab.n5.N5Exception; +import org.janelia.saalfeldlab.n5.N5Exception.N5IOException; +import org.janelia.saalfeldlab.n5.N5KeyValueReader; +import org.janelia.saalfeldlab.n5.N5Reader; +import org.janelia.saalfeldlab.n5.hdf5.N5HDF5Reader; +import org.janelia.saalfeldlab.n5.zarr.ZarrKeyValueReader; + +import bdv.img.n5.BdvN5Format; +import ch.systemsx.cisd.hdf5.HDF5Factory; +import ch.systemsx.cisd.hdf5.IHDF5Reader; +import hdf.hdf5lib.exceptions.HDF5Exception; + +public class BdvN5UniverseFormat +{ + private final N5Reader n5; + + private final String dataset; + + public BdvN5UniverseFormat( final N5Reader n5, final String dataset ) + { + this.n5 = n5; + this.dataset = dataset; + } + + public DataType getSetupDataType( final int setupId ) throws IOException + { + DataType dataType = null; + if ( n5 instanceof N5HDF5Reader ) + { + try + { + final String pathName = getFullPathName( getPathName( setupId ) ); + dataType = n5.getAttribute( pathName, BdvN5Format.DATA_TYPE_KEY, DataType.class ); + } + catch ( final N5Exception e ) + { + dataType = null; + } + return dataType == null ? DataType.UINT16 : dataType; + } + else if ( n5 instanceof ZarrKeyValueReader ) + { + // TODO: implement here + new UnsupportedOperationException( "ZarrKeyValueReader is not supported yet." ); + } + else if ( n5 instanceof N5KeyValueReader ) + { + try + { + final String pathName = getFullPathName( getPathName( setupId ) ); + dataType = n5.getAttribute( pathName, BdvN5Format.DATA_TYPE_KEY, DataType.class ); + } + catch ( final N5Exception e ) + { + throw new IOException( e ); + } + } + else + { + new UnsupportedOperationException( "Unsupported format'" ); + } + if ( dataType == null ) + { + new RuntimeException( "DataType is not available." ); + } + return dataType; + } + + public double[][] getMipmapResolutions( final int setupId ) throws IOException + { + double[][] mipmapResolutions = null; + if ( n5 instanceof N5HDF5Reader ) + { + final String pathName = getFullPathName( getPathName( setupId ) ) + "/resolutions"; + IHDF5Reader reader = openHdf5Reader( ( ( N5HDF5Reader ) n5 ).getFilename().toString() ); + mipmapResolutions = reader.readDoubleMatrix( pathName ); + } + else if ( n5 instanceof ZarrKeyValueReader ) + { + new UnsupportedOperationException( "Unimplemented method 'getPathName'" ); + } + else if ( n5 instanceof N5KeyValueReader ) + { + try + { + final String pathName = getFullPathName( getPathName( setupId ) ); + mipmapResolutions = n5.getAttribute( pathName, BdvN5Format.DOWNSAMPLING_FACTORS_KEY, double[][].class ); + } + catch ( final N5Exception e ) + { + throw new IOException( e ); + } + } + else + { + new UnsupportedOperationException( "Unsupported format'" ); + } + if ( mipmapResolutions == null ) + { + new RuntimeException( "DataType is not available." ); + } + return mipmapResolutions; + } + + public String getPathName( final int setupId ) + { + String pathName = null; + if ( n5 instanceof N5HDF5Reader ) + { + pathName = String.format( "s%02d", setupId ); + } + else if ( n5 instanceof ZarrKeyValueReader ) + { + pathName = String.format( "%d", setupId ); + } + else if ( n5 instanceof N5KeyValueReader ) + { + pathName = String.format( "setup%d", setupId ); + } + else + { + new UnsupportedOperationException( "Unsupported format'" ); + } + return pathName; + } + + public String getPathName( final int setupId, final int timepointId ) + { + String pathName = null; + if ( n5 instanceof N5HDF5Reader ) + { + pathName = String.format( "t%05d/s%02d", timepointId, setupId ); + } + else if ( n5 instanceof ZarrKeyValueReader ) + { + pathName = String.format( "%d/%d", setupId, timepointId ); + } + else if ( n5 instanceof N5KeyValueReader ) + { + pathName = String.format( "setup%d/timepoint%d", setupId, timepointId ); + } + else + { + new UnsupportedOperationException( "Unsupported format'" ); + } + return pathName; + } + + public String getPathName( final int setupId, final int timepointId, final int level ) + { + String pathName = null; + if ( n5 instanceof N5HDF5Reader ) + { + pathName = String.format( "t%05d/s%02d/%d/cells", timepointId, setupId, level ); + } + else if ( n5 instanceof ZarrKeyValueReader ) + { + new UnsupportedOperationException( "Unimplemented method 'getPathName'" ); + } + else if ( n5 instanceof N5KeyValueReader ) + { + pathName = String.format( "setup%d/timepoint%d/s%d", setupId, timepointId, level ); + } + else + { + new UnsupportedOperationException( "Unsupported format'" ); + } + return pathName; + + } + + private String getFullPathName( final String pathName ) + { + return dataset + pathName; + } + + private static IHDF5Reader openHdf5Reader( String hdf5Path ) + { + try + { + return HDF5Factory.openForReading( hdf5Path ); + } + catch ( HDF5Exception e ) + { + throw new N5IOException( "Cannot open HDF5 Reader", new IOException( e ) ); + } + } + +} diff --git a/src/main/java/org/mastodon/mamut/io/loader/N5UniverseImgLoader.java b/src/main/java/org/mastodon/mamut/io/loader/N5UniverseImgLoader.java new file mode 100644 index 000000000..8bb1fa2c4 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/io/loader/N5UniverseImgLoader.java @@ -0,0 +1,489 @@ +/*- + * #%L + * Mastodon + * %% + * Copyright (C) 2014 - 2023 Tobias Pietzsch, Jean-Yves Tinevez + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ +package org.mastodon.mamut.io.loader; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.function.IntFunction; + +import org.janelia.saalfeldlab.n5.DataBlock; +import org.janelia.saalfeldlab.n5.DataType; +import org.janelia.saalfeldlab.n5.DatasetAttributes; +import org.janelia.saalfeldlab.n5.N5Exception; +import org.janelia.saalfeldlab.n5.N5Reader; +import org.janelia.saalfeldlab.n5.universe.N5Factory; +import bdv.AbstractViewerSetupImgLoader; +import bdv.ViewerImgLoader; +import bdv.cache.CacheControl; +import bdv.cache.SharedQueue; +import bdv.img.cache.SimpleCacheArrayLoader; +import bdv.img.cache.VolatileGlobalCellCache; +import bdv.img.n5.DataTypeProperties; +import bdv.util.ConstantRandomAccessible; +import bdv.util.MipmapTransforms; +import mpicbg.spim.data.generic.sequence.AbstractSequenceDescription; +import mpicbg.spim.data.generic.sequence.BasicViewSetup; +import mpicbg.spim.data.generic.sequence.ImgLoaderHint; +import mpicbg.spim.data.sequence.MultiResolutionImgLoader; +import mpicbg.spim.data.sequence.MultiResolutionSetupImgLoader; +import mpicbg.spim.data.sequence.VoxelDimensions; +import net.imglib2.Dimensions; +import net.imglib2.FinalDimensions; +import net.imglib2.FinalInterval; +import net.imglib2.RandomAccessibleInterval; +import net.imglib2.Volatile; +import net.imglib2.cache.volatiles.CacheHints; +import net.imglib2.cache.volatiles.LoadingStrategy; +import net.imglib2.img.basictypeaccess.DataAccess; +import net.imglib2.img.cell.CellGrid; +import net.imglib2.img.cell.CellImg; +import net.imglib2.realtransform.AffineTransform3D; +import net.imglib2.type.NativeType; +import net.imglib2.util.Cast; +import net.imglib2.util.Intervals; +import net.imglib2.view.Views; + +public class N5UniverseImgLoader implements ViewerImgLoader, MultiResolutionImgLoader +{ + private N5Reader n5; + + private N5Factory factory; + + private final String url; + + public String getUrl() + { + return url; + } + + private final String dataset; + + public String getDataset() + { + return dataset; + } + + private BdvN5UniverseFormat format; + + // TODO: it would be good if this would not be needed + // find available setups from the n5 + private final AbstractSequenceDescription< ?, ?, ? > seq; + + /** + * Maps setup id to {@link SetupImgLoader}. + */ + private final Map< Integer, SetupImgLoader< ?, ? > > setupImgLoaders = new HashMap<>(); + + public N5UniverseImgLoader( final String uri, final String dataset, final AbstractSequenceDescription< ?, ?, ? > sequenceDescription ) + { + this.factory = new N5Factory() + .cacheAttributes( true ) + .hdf5DefaultBlockSize( 64 ) + .zarrDimensionSeparator( "/" ) + .zarrMapN5Attributes( true ); + this.url = uri; + this.dataset = dataset.endsWith( "/" ) ? dataset : dataset + "/"; + this.seq = sequenceDescription; + } + + public N5Reader getN5Reader() + { + return n5; + } + + private volatile boolean isOpen = false; + + private SharedQueue createdSharedQueue; + + private VolatileGlobalCellCache cache; + + private int requestedNumFetcherThreads = -1; + + private SharedQueue requestedSharedQueue; + + @Override + public synchronized void setNumFetcherThreads( final int n ) + { + requestedNumFetcherThreads = n; + } + + @Override + public void setCreatedSharedQueue( final SharedQueue createdSharedQueue ) + { + requestedSharedQueue = createdSharedQueue; + } + + private void open() + { + if ( !isOpen ) + { + synchronized ( this ) + { + if ( isOpen ) + return; + + try + { + this.n5 = factory.openReader( url ); + this.format = new BdvN5UniverseFormat( n5, dataset ); + int maxNumLevels = 0; + final List< ? extends BasicViewSetup > setups = seq.getViewSetupsOrdered(); + for ( final BasicViewSetup setup : setups ) + { + final int setupId = setup.getId(); + final SetupImgLoader< ?, ? > setupImgLoader = createSetupImgLoader( setupId ); + setupImgLoaders.put( setupId, setupImgLoader ); + maxNumLevels = Math.max( maxNumLevels, setupImgLoader.numMipmapLevels() ); + } + + final int numFetcherThreads = requestedNumFetcherThreads >= 0 + ? requestedNumFetcherThreads + : Math.max( 1, Runtime.getRuntime().availableProcessors() ); + final SharedQueue queue = requestedSharedQueue != null + ? requestedSharedQueue + : ( createdSharedQueue = new SharedQueue( numFetcherThreads, maxNumLevels ) ); + cache = new VolatileGlobalCellCache( queue ); + } + catch ( final IOException e ) + { + throw new RuntimeException( e ); + } + + isOpen = true; + } + } + } + + /** + * Clear the cache. Images that were obtained from + * this loader before {@link #close()} will stop working. Requesting images + * after {@link #close()} will cause the n5 to be reopened (with a + * new cache). + */ + public void close() + { + if ( isOpen ) + { + synchronized ( this ) + { + if ( !isOpen ) + return; + + if ( createdSharedQueue != null ) + createdSharedQueue.shutdown(); + cache.clearCache(); + + createdSharedQueue = null; + isOpen = false; + } + } + } + + @Override + public SetupImgLoader< ?, ? > getSetupImgLoader( final int setupId ) + { + open(); + return setupImgLoaders.get( setupId ); + } + + private < T extends NativeType< T >, V extends Volatile< T > & NativeType< V > > SetupImgLoader< T, V > + createSetupImgLoader( final int setupId ) throws IOException + { + DataType dataType = format.getSetupDataType( setupId ); + return new SetupImgLoader<>( setupId, Cast.unchecked( DataTypeProperties.of( dataType ) ) ); + } + + @Override + public CacheControl getCacheControl() + { + open(); + return cache; + } + + public class SetupImgLoader< T extends NativeType< T >, V extends Volatile< T > & NativeType< V > > + extends AbstractViewerSetupImgLoader< T, V > + implements MultiResolutionSetupImgLoader< T > + { + private final int setupId; + + private final double[][] mipmapResolutions; + + private final AffineTransform3D[] mipmapTransforms; + + public SetupImgLoader( final int setupId, final DataTypeProperties< T, V, ?, ? > props ) throws IOException + { + this( setupId, props.type(), props.volatileType() ); + } + + public SetupImgLoader( final int setupId, final T type, final V volatileType ) throws IOException + { + super( type, volatileType ); + this.setupId = setupId; + mipmapResolutions = format.getMipmapResolutions( setupId ); + mipmapTransforms = new AffineTransform3D[ mipmapResolutions.length ]; + for ( int level = 0; level < mipmapResolutions.length; level++ ) + mipmapTransforms[ level ] = MipmapTransforms.getMipmapTransformDefault( mipmapResolutions[ level ] ); + } + + @Override + public RandomAccessibleInterval< V > getVolatileImage( final int timepointId, final int level, final ImgLoaderHint... hints ) + { + return prepareCachedImage( timepointId, level, LoadingStrategy.BUDGETED, volatileType ); + } + + @Override + public RandomAccessibleInterval< T > getImage( final int timepointId, final int level, final ImgLoaderHint... hints ) + { + return prepareCachedImage( timepointId, level, LoadingStrategy.BLOCKING, type ); + } + + @Override + public Dimensions getImageSize( final int timepointId, final int level ) + { + try + { + final String pathName = getFullPathName( format.getPathName( setupId, timepointId, level ) ); + final DatasetAttributes attributes = n5.getDatasetAttributes( pathName ); + return new FinalDimensions( attributes.getDimensions() ); + } + catch ( final RuntimeException e ) + { + return null; + } + } + + @Override + public double[][] getMipmapResolutions() + { + return mipmapResolutions; + } + + @Override + public AffineTransform3D[] getMipmapTransforms() + { + return mipmapTransforms; + } + + @Override + public int numMipmapLevels() + { + return mipmapResolutions.length; + } + + @Override + public VoxelDimensions getVoxelSize( final int timepointId ) + { + return null; + } + + /** + * Create a {@link CellImg} backed by the cache. + */ + private < K extends NativeType< K > > RandomAccessibleInterval< K > prepareCachedImage( final int timepointId, final int level, + final LoadingStrategy loadingStrategy, final K type ) + { + try + { + final String pathName = getFullPathName( format.getPathName( setupId, timepointId, level ) ); + final DatasetAttributes attributes = n5.getDatasetAttributes( pathName ); + final long[] dimensions = attributes.getDimensions(); + final int[] cellDimensions = attributes.getBlockSize(); + final CellGrid grid = new CellGrid( dimensions, cellDimensions ); + + final int priority = numMipmapLevels() - 1 - level; + final CacheHints cacheHints = new CacheHints( loadingStrategy, priority, false ); + + final SimpleCacheArrayLoader< ? > loader = createCacheArrayLoader( n5, pathName ); + return cache.createImg( grid, timepointId, setupId, level, cacheHints, loader, type ); + } + catch ( final IOException | N5Exception e ) + { + System.err.println( String.format( + "image data for timepoint %d setup %d level %d could not be found.", + timepointId, setupId, level ) ); + return Views.interval( + new ConstantRandomAccessible<>( type.createVariable(), 3 ), + new FinalInterval( 1, 1, 1 ) ); + } + } + } + + private static class N5CacheArrayLoader< T, A extends DataAccess > implements SimpleCacheArrayLoader< A > + { + private final N5Reader n5; + + private final String pathName; + + private final DatasetAttributes attributes; + + private final IntFunction< T > createPrimitiveArray; + + private final Function< T, A > createVolatileArrayAccess; + + N5CacheArrayLoader( final N5Reader n5, final String pathName, final DatasetAttributes attributes, + final DataTypeProperties< ?, ?, T, A > dataTypeProperties ) + { + this( n5, pathName, attributes, dataTypeProperties.createPrimitiveArray(), dataTypeProperties.createVolatileArrayAccess() ); + } + + N5CacheArrayLoader( final N5Reader n5, final String pathName, final DatasetAttributes attributes, + final IntFunction< T > createPrimitiveArray, + final Function< T, A > createVolatileArrayAccess ) + { + this.n5 = n5; + this.pathName = pathName; + this.attributes = attributes; + this.createPrimitiveArray = createPrimitiveArray; + this.createVolatileArrayAccess = createVolatileArrayAccess; + } + + @Override + public A loadArray( final long[] gridPosition, final int[] cellDimensions ) throws IOException + { + final DataBlock< T > dataBlock; + try + { + dataBlock = Cast.unchecked( n5.readBlock( pathName, attributes, gridPosition ) ); + } + catch ( final N5Exception e ) + { + throw new IOException( e ); + } + if ( dataBlock != null && Arrays.equals( dataBlock.getSize(), cellDimensions ) ) + { + return createVolatileArrayAccess.apply( dataBlock.getData() ); + } + else + { + final T data = createPrimitiveArray.apply( ( int ) Intervals.numElements( cellDimensions ) ); + if ( dataBlock != null ) + { + final T src = dataBlock.getData(); + final int[] srcDims = dataBlock.getSize(); + final int[] pos = new int[ srcDims.length ]; + final int[] size = new int[ srcDims.length ]; + Arrays.setAll( size, d -> Math.min( srcDims[ d ], cellDimensions[ d ] ) ); + ndArrayCopy( src, srcDims, pos, data, cellDimensions, pos, size ); + } + return createVolatileArrayAccess.apply( data ); + } + } + } + + public static SimpleCacheArrayLoader< ? > createCacheArrayLoader( final N5Reader n5, final String pathName ) throws IOException + { + final DatasetAttributes attributes; + try + { + attributes = n5.getDatasetAttributes( pathName ); + } + catch ( final N5Exception e ) + { + throw new IOException( e ); + } + return new N5CacheArrayLoader<>( n5, pathName, attributes, DataTypeProperties.of( attributes.getDataType() ) ); + } + + /** + * Like `System.arrayCopy()` but for flattened nD arrays. + * + * @param src + * the (flattened) source array. + * @param srcSize + * dimensions of the source array. + * @param srcPos + * starting position in the source array. + * @param dest + * the (flattened destination array. + * @param destSize + * dimensions of the source array. + * @param destPos + * starting position in the destination data. + * @param size + * the number of array elements to be copied. + */ + // TODO: This will be moved to a new imglib2-blk artifact later. Re-use it from there when that happens. + private static < T > void ndArrayCopy( + final T src, final int[] srcSize, final int[] srcPos, + final T dest, final int[] destSize, final int[] destPos, + final int[] size ) + { + final int n = srcSize.length; + int srcStride = 1; + int destStride = 1; + int srcOffset = 0; + int destOffset = 0; + for ( int d = 0; d < n; ++d ) + { + srcOffset += srcStride * srcPos[ d ]; + srcStride *= srcSize[ d ]; + destOffset += destStride * destPos[ d ]; + destStride *= destSize[ d ]; + } + ndArrayCopy( n - 1, src, srcSize, srcOffset, dest, destSize, destOffset, size ); + } + + private static < T > void ndArrayCopy( + final int d, + final T src, final int[] srcSize, final int srcPos, + final T dest, final int[] destSize, final int destPos, + final int[] size ) + { + if ( d == 0 ) + System.arraycopy( src, srcPos, dest, destPos, size[ d ] ); + else + { + int srcStride = 1; + int destStride = 1; + for ( int dd = 0; dd < d; ++dd ) + { + srcStride *= srcSize[ dd ]; + destStride *= destSize[ dd ]; + } + + final int w = size[ d ]; + for ( int x = 0; x < w; ++x ) + { + ndArrayCopy( d - 1, + src, srcSize, srcPos + x * srcStride, + dest, destSize, destPos + x * destStride, + size ); + } + } + } + + private String getFullPathName( final String pathName ) + { + return dataset + pathName; + } +} diff --git a/src/main/java/org/mastodon/mamut/io/loader/XmlIoN5UniverseImgLoader.java b/src/main/java/org/mastodon/mamut/io/loader/XmlIoN5UniverseImgLoader.java new file mode 100644 index 000000000..e89f282b3 --- /dev/null +++ b/src/main/java/org/mastodon/mamut/io/loader/XmlIoN5UniverseImgLoader.java @@ -0,0 +1,97 @@ +/*- + * #%L + * Mastodon + * %% + * Copyright (C) 2014 - 2023 Tobias Pietzsch, Jean-Yves Tinevez + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ +package org.mastodon.mamut.io.loader; + +import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; + +import org.janelia.saalfeldlab.n5.N5URI; +import org.jdom2.Element; + +import mpicbg.spim.data.XmlHelpers; +import mpicbg.spim.data.generic.sequence.AbstractSequenceDescription; +import mpicbg.spim.data.generic.sequence.ImgLoaderIo; +import mpicbg.spim.data.generic.sequence.XmlIoBasicImgLoader; + +import static mpicbg.spim.data.XmlKeys.IMGLOADER_FORMAT_ATTRIBUTE_NAME; + +@ImgLoaderIo( format = "bdv.n5.universe", type = N5UniverseImgLoader.class ) +public class XmlIoN5UniverseImgLoader implements XmlIoBasicImgLoader< N5UniverseImgLoader > +{ + public static final String URL = "Url"; + + public static final String DATASET = "Dataset"; + + @Override + public Element toXml( N5UniverseImgLoader imgLoader, File basePath ) + { + final Element elem = new Element( "ImageLoader" ); + elem.setAttribute( IMGLOADER_FORMAT_ATTRIBUTE_NAME, "bdv.n5.universe" ); + elem.setAttribute( "version", "1.0" ); + String url = imgLoader.getUrl(); + if ( hasSchema( url ) ) + { + elem.addContent( XmlHelpers.pathElement( URL, new File( url ), basePath ) ); + } + else + { + elem.addContent( XmlHelpers.textElement( URL, imgLoader.getUrl() ) ); + } + elem.addContent( XmlHelpers.textElement( DATASET, imgLoader.getDataset() ) ); + return elem; + } + + @Override + public N5UniverseImgLoader fromXml( Element elem, File basePath, AbstractSequenceDescription< ?, ?, ? > sequenceDescription ) + { + String url = XmlHelpers.getText( elem, URL ); + if ( !hasSchema( url ) ) + { + url = XmlHelpers.loadPath( elem, URL, basePath ).toString(); + } + final String dataset = XmlHelpers.getText( elem, DATASET ); + return new N5UniverseImgLoader( url, dataset, sequenceDescription ); + } + + private static boolean hasSchema( final String url ) + { + String scheme = null; + try + { + final URI encodedUri = N5URI.encodeAsUri( url ); + scheme = encodedUri.getScheme(); + + } + catch ( URISyntaxException ignored ) + {} + return scheme != null; + } + +} diff --git a/src/main/java/org/mastodon/mamut/launcher/NewMastodonProjectPanel.java b/src/main/java/org/mastodon/mamut/launcher/NewMastodonProjectPanel.java index 8f008e3c0..617b43fd3 100644 --- a/src/main/java/org/mastodon/mamut/launcher/NewMastodonProjectPanel.java +++ b/src/main/java/org/mastodon/mamut/launcher/NewMastodonProjectPanel.java @@ -82,7 +82,7 @@ public NewMastodonProjectPanel( final String panelTitle, final String buttonTitl gbcLblNewMastodonProject.gridy = 0; add( lblNewMastodonProject, gbcLblNewMastodonProject ); - rdbtBrowseToBDV = new JRadioButton( "Browse to a BDV file (xml/h5 pair):" ); + rdbtBrowseToBDV = new JRadioButton( "Browse to a BDV file (xml + N5/OME-Zarr/HDF5 pair):" ); final GridBagConstraints gbc_rdbtBrowseToBDV = new GridBagConstraints(); gbc_rdbtBrowseToBDV.anchor = GridBagConstraints.SOUTHWEST; gbc_rdbtBrowseToBDV.insets = new Insets( 5, 5, 5, 5 ); diff --git a/src/main/java/org/mastodon/ui/util/CombinedFileFilter.java b/src/main/java/org/mastodon/ui/util/CombinedFileFilter.java new file mode 100644 index 000000000..a4f57aae0 --- /dev/null +++ b/src/main/java/org/mastodon/ui/util/CombinedFileFilter.java @@ -0,0 +1,44 @@ +package org.mastodon.ui.util; + +import java.io.File; +import javax.swing.filechooser.FileFilter; + +public class CombinedFileFilter extends FileFilter +{ + + private FileFilter[] fileFilters; + + public CombinedFileFilter( FileFilter... fileFilters ) + { + this.fileFilters = fileFilters; + } + + @Override + public boolean accept( File f ) + { + for ( FileFilter fileFilter : fileFilters ) + { + if ( fileFilter.accept( f ) ) + { + return true; + } + } + return false; + } + + @Override + public String getDescription() + { + StringBuilder sb = new StringBuilder(); + for ( FileFilter fileFilter : fileFilters ) + { + if ( sb.length() > 0 ) + { + sb.append( " or " ); + } + sb.append( fileFilter.getDescription() ); + } + return sb.toString(); + } + +} diff --git a/src/main/java/org/mastodon/ui/util/HDF5FileFilter.java b/src/main/java/org/mastodon/ui/util/HDF5FileFilter.java new file mode 100644 index 000000000..ecb2f6392 --- /dev/null +++ b/src/main/java/org/mastodon/ui/util/HDF5FileFilter.java @@ -0,0 +1,37 @@ +/*- + * #%L + * Mastodon + * %% + * Copyright (C) 2014 - 2022 Tobias Pietzsch, Jean-Yves Tinevez + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ +package org.mastodon.ui.util; + +public class HDF5FileFilter extends CombinedFileFilter +{ + public HDF5FileFilter() + { + super( new ExtensionFileFilter( "h5" ), new ExtensionFileFilter( "hdf5" ) ); + } +} diff --git a/src/test/java/N5Tutorial.java b/src/test/java/N5Tutorial.java new file mode 100644 index 000000000..74b2e1762 --- /dev/null +++ b/src/test/java/N5Tutorial.java @@ -0,0 +1,66 @@ +import java.util.Arrays; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import javax.swing.JFileChooser; +import javax.swing.filechooser.FileNameExtensionFilter; + +import org.janelia.saalfeldlab.n5.DatasetAttributes; +import org.janelia.saalfeldlab.n5.N5KeyValueWriter; +import org.janelia.saalfeldlab.n5.N5Reader; +import org.janelia.saalfeldlab.n5.N5Writer; +import org.janelia.saalfeldlab.n5.imglib2.N5Utils; +import org.janelia.saalfeldlab.n5.universe.N5Factory; + +import net.imglib2.RandomAccessibleInterval; +import net.imglib2.type.numeric.integer.UnsignedShortType; + +public class N5Tutorial +{ + public static void main( final String[] args ) throws InterruptedException, ExecutionException + { + final String n5Url = "https://janelia-cosem.s3.amazonaws.com/jrc_hela-2/jrc_hela-2.n5"; + final String n5Group = "/volumes/raw"; + final String n5Dataset = n5Group + "/s4"; + final N5Reader n5 = new N5Factory() + .cacheAttributes( true ) + .hdf5DefaultBlockSize( 64 ) + .zarrDimensionSeparator( "/" ) + .zarrMapN5Attributes( true ) + .openReader( n5Url ); + + final DatasetAttributes attributes = n5.getDatasetAttributes( n5Dataset ); + + final RandomAccessibleInterval< UnsignedShortType > rai = N5Utils.open( n5, n5Dataset ); + + String downloadsDir = System.getProperty( "user.home" ) + "/Downloads/"; + + final ExecutorService exec = Executors.newFixedThreadPool( 10 ); + try + { + try ( final N5Writer n5Out = new N5Factory().openFSWriter( downloadsDir + "/test.n5" ) ) + { + N5Utils.save( rai, n5Out, n5Dataset, attributes.getBlockSize(), attributes.getCompression(), exec ); + } + + /* save this dataset into a filesystem Zarr container */ + try ( final N5Writer zarrOut = new N5Factory().openZarrWriter( downloadsDir + "/test.zarr" ) ) + { + N5Utils.save( rai, zarrOut, n5Dataset, attributes.getBlockSize(), attributes.getCompression(), exec ); + } + + /* save this dataset into an HDF5 file, parallelization does not help here */ + try ( final N5Writer hdf5Out = new N5Factory().openHDF5Writer( downloadsDir + "/test.hdf5" ) ) + { + N5Utils.save( rai, hdf5Out, n5Dataset, attributes.getBlockSize(), attributes.getCompression() ); + } + + } + finally + { + exec.shutdown(); + } + + } +} diff --git a/src/test/java/org/mastodon/StartMastodonLauncher.java b/src/test/java/org/mastodon/StartMastodonLauncher.java index 0a2761c1b..6802ed69b 100644 --- a/src/test/java/org/mastodon/StartMastodonLauncher.java +++ b/src/test/java/org/mastodon/StartMastodonLauncher.java @@ -28,11 +28,14 @@ */ package org.mastodon; +import org.mastodon.mamut.io.loader.XmlIoN5UniverseImgLoader; import org.mastodon.mamut.launcher.MastodonLauncherCommand; import org.scijava.Context; import org.scijava.command.CommandService; import org.scijava.ui.UIService; +import mpicbg.spim.data.generic.sequence.ImgLoaders; + /** * Shows the ImageJ main window and Mastodon launcher. * @@ -46,6 +49,7 @@ public static void main( final String... args ) @SuppressWarnings( "resource" ) final Context context = new Context(); final UIService uiService = context.service( UIService.class ); + ImgLoaders.registerManually( XmlIoN5UniverseImgLoader.class ); uiService.showUI(); final CommandService commandService = context.service( CommandService.class ); commandService.run( MastodonLauncherCommand.class, true ); diff --git a/src/test/java/org/mastodon/StartMastodonOnProject.java b/src/test/java/org/mastodon/StartMastodonOnProject.java index 44a986042..7c6a33602 100644 --- a/src/test/java/org/mastodon/StartMastodonOnProject.java +++ b/src/test/java/org/mastodon/StartMastodonOnProject.java @@ -34,7 +34,9 @@ import org.mastodon.mamut.MainWindow; import org.mastodon.mamut.ProjectModel; -import org.mastodon.mamut.io.ProjectLoader; +import org.mastodon.mamut.io.project.MamutProject; +import org.mastodon.mamut.io.project.MamutProjectIO; +import org.mastodon.mamut.launcher.LauncherUtil; import org.scijava.Context; import org.scijava.thread.ThreadService; @@ -53,13 +55,14 @@ public static void main( final String... args ) public static void launch( final String projectPath ) { System.setProperty( "apple.laf.useScreenMenuBar", "true" ); - try (Context context = new Context()) + try ( Context context = new Context() ) { final ThreadService threadService = context.getService( ThreadService.class ); threadService.run( () -> { try { - final ProjectModel appModel = ProjectLoader.open( projectPath, context, true, false ); + final MamutProject project = MamutProjectIO.load( projectPath ); + final ProjectModel appModel = LauncherUtil.openWithDialog( project, context, null, System.out::println ); final MainWindow win = new MainWindow( appModel ); win.setVisible( true ); win.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mito_s3_omezarr copy.xml b/src/test/resources/org/mastodon/mamut/io/loader/mito_s3_omezarr copy.xml new file mode 100644 index 000000000..422ee47e0 --- /dev/null +++ b/src/test/resources/org/mastodon/mamut/io/loader/mito_s3_omezarr copy.xml @@ -0,0 +1,68 @@ + + + . + + + + + 0 + 0 + + + + 0 + Setup0 + 500 471 519 + + micrometer + 0.55 0.55 0.55 + + + 0 + + + + + 0 + 0 + + + https://s3.embl.de/prospr-myosin.ome.zarr + / + + + + + + 0.55 0.0 0.0 0.0 0.0 0.55 0.0 0.0 0.0 0.0 0.55 0.0 + + + + \ No newline at end of file diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mito_s3_omezarr.xml b/src/test/resources/org/mastodon/mamut/io/loader/mito_s3_omezarr.xml new file mode 100644 index 000000000..422ee47e0 --- /dev/null +++ b/src/test/resources/org/mastodon/mamut/io/loader/mito_s3_omezarr.xml @@ -0,0 +1,68 @@ + + + . + + + + + 0 + 0 + + + + 0 + Setup0 + 500 471 519 + + micrometer + 0.55 0.55 0.55 + + + 0 + + + + + 0 + 0 + + + https://s3.embl.de/prospr-myosin.ome.zarr + / + + + + + + 0.55 0.0 0.0 0.0 0.0 0.55 0.0 0.0 0.0 0.0 0.55 0.0 + + + + \ No newline at end of file diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/.zattrs b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/.zattrs new file mode 100644 index 000000000..c5eadb8a2 --- /dev/null +++ b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/.zattrs @@ -0,0 +1,3 @@ +{ + "bioformats2raw.layout" : 3 +} \ No newline at end of file diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/.zgroup b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/.zgroup new file mode 100644 index 000000000..aa4bf031e --- /dev/null +++ b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/.zgroup @@ -0,0 +1,3 @@ +{ + "zarr_format" : 2 +} \ No newline at end of file diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/.zattrs b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/.zattrs new file mode 100644 index 000000000..33a565922 --- /dev/null +++ b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/.zattrs @@ -0,0 +1,70 @@ +{ + "multiscales" : [ { + "metadata" : { + "method" : "loci.common.image.SimpleImageScaler", + "version" : "Bio-Formats 6.13.0" + }, + "axes" : [ { + "unit" : "second", + "name" : "t", + "type" : "time" + }, { + "name" : "c", + "type" : "channel" + }, { + "name" : "z", + "type" : "space" + }, { + "unit" : "micrometer", + "name" : "y", + "type" : "space" + }, { + "unit" : "micrometer", + "name" : "x", + "type" : "space" + } ], + "name" : "mitosis_small.tif", + "datasets" : [ { + "path" : "0", + "coordinateTransformations" : [ { + "scale" : [ 0.14285714285714285, 1.0, 1.0, 0.08850000022125, 0.08850000022125 ], + "type" : "scale" + } ] + } ], + "version" : "0.4" + } ], + "omero" : { + "channels" : [ { + "color" : "FF0000", + "coefficient" : 1, + "active" : true, + "label" : "Channel 0", + "window" : { + "min" : 1593.0, + "max" : 47693.0, + "start" : 1593.0, + "end" : 47693.0 + }, + "family" : "linear", + "inverted" : false + }, { + "color" : "00FF00", + "coefficient" : 1, + "active" : true, + "label" : "Channel 1", + "window" : { + "min" : 1619.0, + "max" : 21186.0, + "start" : 1619.0, + "end" : 21186.0 + }, + "family" : "linear", + "inverted" : false + } ], + "rdefs" : { + "defaultT" : 0, + "model" : "color", + "defaultZ" : 2 + } + } +} \ No newline at end of file diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/.zgroup b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/.zgroup new file mode 100644 index 000000000..aa4bf031e --- /dev/null +++ b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/.zgroup @@ -0,0 +1,3 @@ +{ + "zarr_format" : 2 +} \ No newline at end of file diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/.zarray b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/.zarray new file mode 100644 index 000000000..e829e67d9 --- /dev/null +++ b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/.zarray @@ -0,0 +1,17 @@ +{ + "chunks" : [ 1, 1, 1, 196, 171 ], + "compressor" : { + "clevel" : 5, + "blocksize" : 0, + "shuffle" : 1, + "cname" : "lz4", + "id" : "blosc" + }, + "dtype" : ">u2", + "fill_value" : 0, + "filters" : null, + "order" : "C", + "shape" : [ 2, 2, 5, 196, 171 ], + "dimension_separator" : "/", + "zarr_format" : 2 +} \ No newline at end of file diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/0/0/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/0/0/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..086e8fca2f04b20453b98107a92f55df7b66f09b GIT binary patch literal 67048 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

ySq-i?zmfc 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 z%0Dm#^eo_v?y6hhw9E)A(nM9JYw4Ui#R)_ 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 D9t~s~ literal 0 HcmV?d00001 diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/0/3/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/0/3/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..180856225a154609487e658e78c1b2f493a38de9 GIT binary patch literal 67048 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/0/4/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/0/4/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..291d5456ea272f6c7e3b588f048802813053742d GIT binary patch literal 67048 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/1/0/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/1/0/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..febdca3bfa14b7eee4663b9c3ac22f88ca85d0f2 GIT binary patch literal 67048 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 Dm3v%T literal 0 HcmV?d00001 diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/1/1/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/1/1/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..61ccb38d24cdc4b2f48c88d808ca3c77d3c22c21 GIT binary patch literal 67048 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 RGLl9+t~y#BtBK~Q{U6@?+l~ML literal 0 HcmV?d00001 diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/1/2/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/1/2/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..0b2cda1619e85e03ebe8ad3fab18d50be33f3d95 GIT binary patch literal 67048 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 z zgg|mEPW{*D-EnmyM?%*lqvCrx6l98`_;3{>Gf}PEO2Brn%iRS zjjXebiRjeq=ALq*RzjA8zcyZsROg~^nMXr#Cd>y1+Y{Q`O>8-x46WZ__CN6nx9)2G z8_fn(eFS=&pL{A*7enb{n&%fbi)o0`U(RX;iT`7P^k-1&0#7+$DuZsSpvXZxvUkvw z)C0#n1v^0oLWe$p7M9=HKAJ%>khhp>x`^zm4bZC9<7<#i^b(3sKREBb^s&f7ZoyHp zMwX((kxlRu=u``llQst`^B?IYJBqTH!~2j5nDEYt2za7HP?L;QPsl9t0^KiG&}O0p z`1$V81XU1A)Wx#3Hp(cXKLeU2ZB32d+Bn;PwvOI!?h=92*zCdeNhfkVOE{XcE%9ME zB`JH{t{4{kI8rb;+Os`0CtM+RR4j|?5qrRQ(Y4dQ&f~K`b+orW&~I4!+BTX$m=9WW zo2%$wwLfG7yp!vG@sH99M`aLf(*{f@H-U>*#Hsa(qjD}=$@arx*&CSh8MrGqLf^O^ zN#*a90>}<7gRF56CiQ-p4@$ysH5mNqK9&lV&PU(_O@TE=(Ig}zALjX3am@F?RDnQR z=^3Rb^^zpki`7KEDup|x8XO*1m2qqxdIQ2I<39Zp_jCjB5qU^`+FH(Ioq2QmFI|Nx zzYR3REzt#bBXw~vrB?kP6Rh3zhn)Moq^g-Owb>yG$n-7Oi61=v|tu9dwumBc# zDKZ#Ko^F|doU#O$?#&bI6`egiH^O4OWy_J$C~ijRaNMiV*zg{2mq3&7t>~4m zcY%X3p~%NLH8jgL-<9A=@TWR*TdrB6Y?t-TmLc+uHIw6Mc=%{?1#2$=gB3D$mhL{D6o0AZ>{B%y!Csd`r3D zjhjeJJiA&L2xC(q6eq}j+}l5ZS7gJVSQK2u2$q%CMS@aM;NcZ%W08aj?FIB)He__d zjf5^WogEXo)JpPi^fe2_JlUG<0;AoO*9FV@(-Ny*kjSf0C#mh#hjNKpQlBTi+FeT# zr?h|cOmt`V*9!NJTa$DxWlG}Nl$O!;BY9#EM7N5g{&S(p-kqT>!B^oCvDT>hQGW+k zIEp*DvzKF|&G1e`4#zt4eq*n7fb%bHj8+zRzz$^L-Irx>OD*Mb>KfXXWrFTAJA5^n z)taobdIHEuV+HxNau0g)vcUhFgE{f@8$dd*klRWf)(lDRr|XKIs93)XU!T zo-`}pz#?$VjAyIaMKDyHUZN*>Il5HYLN(OIIP54m1UGOVULD_OM(H#iL5&(E;S~~D z;mi9QUVydou^7*Lh<|xUJ-=FCJl59B`r^3J&e8%Z@0;3W1B!J0h-m;-aOg#x zOlXHrU{LgA@2PP8=ngTK=o|itp(g%a;eX>V1&yds(xlkoQ9oRzd>_64d2cwnS{6AP zn~z#DBAxHDvDH%8GSrAyhwDTw$v2Y2>?e9H$tsb@>@#|;7C@BBf<5dic0#+88=rnE zyCnWmzLLLDO@^XxJ;JAv<4Bo%!;hE>;C&qhq<<)WjRGy1Od_N#7~FlN3h9q}Qk`vt zqNFAZAy*f9Pi!t2Qvoz&2`1b}NWLwFj_L<`{f=ZOs{)ltHr`gfi#hBAawaKy->N{r z+QZrY1IZ6=+ziEV6Vw-T*iEqS)xej1q?>6g-kXMaDyEC&EWexuk5(CN9B<6?(K~|k z-n_X=_*uE&QswAiG32*1fItx1u_LMN4N0T z4SosNiy9KwGSJJP;OZVWLW3j4V%r3N1ZsQSA)CFjtGy!)y5Yn6b#<0;QTxk0*=luU z)w63|_2H7klhKVyaZ;2NC%^%&#b-S!4?rzGShPW>X|M_`npVeI`$XGA*_;aw!$Y(m zSnmwjhcJ%h1|mHjx)(p{&<^ye-!b=h1VR7>H?WV&n1`N0)%z>|s2gpI-7;2opAM$e za7W)I$;w4kX%`TxdC&r!BLnz$<5 zmUP7X`WE_y+F&1RxE`g#^OX5ohr^kK^#zapEt&9}* z7xwjvWDO>xvobA7}?7 zYIAy!IrOmjCYlHbn5*aF1AJ8x)^xl> z3h<4Z&|KzJcFF#{3AFKHcr1KSs#amc#9;!ZE2#&Sp@p1=>n#t7BMxX(A7XD!C;Aw- z>oEFF?Z~f@-)RL*By-tlssPvTL3;xQ+{9F61m67)=wBJ~0RkjdBK3vU;dyoMxYCGMghDK+HVwGyPOM>Nnv?OV-}N^Lt*KZ(tIz4A!&hz0F%4)tuXH zTOF_b17nJZP03jzGom|sUi*)F%S8$Ysz%Qa9}hi?SA2hmLaut=58>sZwh7<;nLL$T z3I5FXSC;$EWJ_~P(41x+YdNDn);5`gmcm9SU6JSX;XqJo$UjLsG%E|BTlkf(zgAq7 z8~@LlTat{S4sw%Z13I^cd;{*elKc&qPJZPn6vbiWroKlm+;zFzB)ftR!GocMR{H%TYXZF<4l~y{eBCo%eKhnY>RW#kPTwnFk|`IA-I?Rky-h8 znNKzpxtSzuRTVn^n(_?yXg+yRKGl9VkJg)7im4y0L+mR&e#av7H0vf$p_or8U866A z?)v8WsQaV;MD*uKT)0{6qj2@0$-U9H)pf}i^p^D<3Oo#~@Mg4ag8%lr<)>wY^_+FD zKF91)(+r!gSVvkrXbZFk<_21S%*ZZvHPj{^_6R88ad=G1kg3@EaTfU{V_6tDRbR4# zzeUQyYw-gU>lAp#mLRY067(pS(PMR?cgY7D&%Yw^dNAC=eSo!Q1y53yF}em!%`4g% z{+0SbQ%b^pv5&ka1C@CM&SgATI~j~8NBLUhlwAYEdXOvR6grBR&|H6|Y2XDjAwBgJ zosGGpBYO{AwKk@cOTb(6v)}15R$Tne;@C(il#1ZZ=#BL0n*5}kFW+i+_$XuoBwA)_ z4UJ85jnQ4JX02niR`Y8AT89{|ZC-l@>k~(m)9OAPs2MI8w-{lI;jrSHZ;TeuK_H=u7TQ7&-I?=Mjp~%x_uDQ)C@tvvW zLi%y-nQYDnYwbmSH3aRa4IEWY@}9ksnRsVpY?fwUplK_MT-O8W9sA(<%uxE!0=UJv zGRm}ztYr&;0~Aq4<6Y6&NFYkrkWV*;UPN6ffn5%klW%dzYnEdK9-F65Q*sgIuznAK2gm9W=Ds1caxZ{?o&hRUhR_cp6}M)Xi~pn zovmN7JTQKD6f|eCw6#?9eexA^&5CZDkcv8WFF4HO^DK6^^tFm~j_nw|GSVe#S>QK+ z!|tigJE#IvBikTAt9FZ6QiUiF6dMV#V= zp{i|wY@@2;cep|BV=kzU?mH*5&?#cR@)@1t8kr5Ai#fCj>W`m3Q*N0K0O>5l0%R+Z z40&kiuzq6FOh*q|;aBCM3xKA)9l4R2xr5{TG z*FTyKL1t-lD8U0j9R^{x?F1#j0AT?N-1h%FHX}%d*nlc$2NpY>|3)V8H8MdqAUnl0 z;gyS^_0WOPkAur3Rh_{r@S||r9Oq2_B|F3Q|5Dv23tEeqe=~day!vOyFf%m<>z!dO!R_G0ja1W&a(%L5LunklcTnCT=PKted-9{R|1&9s%Q=B?qJegI|CUHXD#2CI+= z)o&D;j5|c{iwxq3krKh4$#IPD9n+oxD_!ibwF>>I(ghv0Oc^T{DUsCHZjmt~SOTvg?+&t}c$tj>nFB0T%uguAS(Q z`sOI*H{3lvBmAW!>4ALFEkY;5bwZc?UxSBjXWYkK?qE^xTvvmrBCa;B0k&th&en;> zO3P;3XX|TYzj0fC0x$U%eTP0mk1~!x>0LyvfZpS8bqHy~25IHl7&0EZz0Y)wNES0u zcPfg?&<_bZkla9m|8u1%nTrYO8g}^Igr0W+60Mdf4muRvcze{mtaO*`P6vxWp(rj! zzL6og36CQOraZR26od+38(~Pl!Bav%G>*T<*0I6l6B|XBla0J2jl~3C4heGQm8amV zH(`g^CvmpUm zitzXvi;YTV&5~7XY!sF*eWkI(cxl`>x7J5mpE|ZU+xik*{y_fN*-@pU-usEKb+EcG zF%XXZGkR>KYhoXNG53G&eU7gF&7POu1mC)-LcU!A&AHo_?ig?RYRomV851q(Na=cN zRpn1}7V{3{Z|%IAOCK+Yy<1Fj&BDWA2aJi<=G2Ye58HcT(eEc6AK{|VUf zl?W!a9;V5z@UMRYZ&#d*BH8&{sDR7hsqW^7(T{t0KB$~5BAdD#`06cmmi>U(Lvv>O zK_s}XMoLW}SBj#V-a$REAGgXERG}Qu$>atWGXcuL$I5%9F?xdI*bDiHT&37g2Bu7q zCP;w14UO?ZFtjdK8;Hz0@GaO!r{xr_Pyv3>zu;16&5!GYuq85+dd}+CzH3%(hnykq z=ov(!JRon$R+a|vU!Arba8kXpH7Tk=@OEq{_FME4WHMB;^$k|@jSWPHO_9~$JqMKv=0Oo7^8s7BO24vIz_O;o`A~`F0;ZggapfLO2YS7lsmR4{L(ZD8 z2?CDodZaij4LySmXu>nrh)>45b{B5;_L#S}f}1%=Q0-RyR`4--?f2IcP(S} zWKkflE1~px4lX_uu%);36wd+P@FuilJLpb2gDj&XyjFGVCer%v<&Ce`)IF<{zjF#Gqyc1Oyb(6@GCcQ6Im=`wI9 z*!IQY{~%*=_UmG%?W>%m4H;8@$8DVt-|-ew7W+BZVA@#7&p_F6ovxNhZsV6|4LL%7 z6%DYXW(Zp%9*BaXgBT!GwW!g=yh6Px^Xd)Z@lOJKKUgnmWU=Y`VcP($m!*%f&w9go z-s^SOg`2%cL=V4pFLaG^E{R(0H;2RiUBQNl&BMigbDgss8=L`eC--OfQTJf)a9?3} zoR`?A+D==>S`FikxwF>9SYa!tztR)5QTjQ3pl1?hUp9|4f5V(h6>1%CD+Ihp@Nkbu%DI`#td16eegF)(J@o29S}m zG>^dcBji(7!0BCs%{g;OMQ~lcO&-%~(4Kb7OGkn9A-ct2s%B z$BxZ2>ISW*)*Z?mrbpDO@{+8~pNi|6+sLW9#44k+o~|FXe{kRPFNtXu-9L6*prz}+ zJCpO3*Ad%1GCy+7*EGr=84{cv80-vKrDKKXsC$yDbugp9w>P8rxI5siZnpssf3FiG zpgyxESZ}N2w6WU%bh}nx9dESMAIVp072bv{*zEm z90yBZ8}8lNA}=k3j=vH%;N8UAxrF4TQ_)kT589%YUah3fAswNzj_YshM_sKxxTp%g#~bbBl^5+wR@ktjc0~`rk@47 zhtgsfglokFeXU(D9Jg&F-7!&ahc7VCc{$M1yV3i|nr=T~scX4vjKNfuRofvN>yI6V z^Ppijk1=ZKsj@SFCLhX7`e`79W!Ot#DOPUAewsbx3_D8-VgJq^>Jk!X{1NL$2Pq3h zKzU2Pu>80;A8|=NY$v-V%Hc`c(G`tECQD{`f%{P_6j@{8&bkQK!3r>5JCu^Rm**&B zkhiqWw34QQDep~!EUy6SP2T_^d{65`<9CRe(JN$x?&T|R-5+ol7Es#pBfw@-fc&aJ z!55HQd^u*-Xy^gL@UQiz4!H?9@N2nAuK`r!n3}@oL%r&jpHa*1%1uzf%+gzFZ;S`V zHOnh=BdvyU(O~9cF4cQ6_&NS#{K43|-p|gS4zJ^tuSK|PuzJjj=;Lu)qY49Oo$cM~ zDDNESB9809W1h-B?rZGKZCMB1)nD2p-D9jXrs>g|qWbh6mWk#Hwn^so_+D=!d0J8b zQ7g0M+BxwaRp14W14B{|vv^%Ph%aLM!I>&-s{9>q$}Ap4R-O*D| zg^Lsyd08p>j;rc13GV*R3eMS%TlW60 zK`uw|rLV7duX~+kuUbZbtZ$U1)B>6Y1mKi8vv$^Y$J0t*ZZ3f2>3s5$*v%hnQ}k3Z zfc*}INF1=a8@w3ZM(**A{IZ+?W~;iW3RG*3@WNMg7-_-KJd$yN!PO1LRHSbZo+Q^>=c*JR{f1G@7h_hD&P`G)oud zQhHZpz)d@Z4bx_kSE3!V@LIrakU>bGha-7UI#$dU+f7&5LQDaj_;C6eDU2uNV(y3j z{~)r?$I#1ohIUa9+Ur`_qkBj3AQ|ilYF<1X6mOXw+S!bJ7h9|BqU(@rcaUI{47L^B zR!U=E8FmlQG3+_E6qE#?dJ28VS<**PGM}#$Wn^6iZaKCL_v$XBnBCA%s0;ZXaT4rc z4gLiR#erbt>l-#89v#Gbb4yDvbqsc#E5<9NuU55ecXoBVL;Ir##&?ZX1E*YLY%iQ+ zebb}tq3Kaeqw7R+g!Tk~dSaaG?X7K_tS#)VtRoyXY&O?Q&s)o3YYV-QeV5TtYbPV( zmbw+%;HxrO=G9IbMJy)sVl7F_g8Ylo$Xj{Lzlud_Te!4<)I-}dR8$ai*>T)+Yv@5i zd0E_MSNK)hSqajncoRn6G8bP&3nP`f3>+9egoZ@jbfBsI z*fOOA_P)Qsn|eygjeLPb?WFP$?w_Y@6)TVab|M>(9U;H8+_%|$j4i{IggC@nX$pU~_YVgsun7pg~~#4?HFT4w%S z%gI+5{VfyB8n(i0(W+SIYeV$xmaQ(Ie}b=CY`3JS_(uK={#>?*Q^SEvr0$}0B$VsC*SR>1%F#72#*bRWL6@ya_SFw};I zVj<3u3(0qBK!yCs?Jk4s+}HKpHQ&C?9&Jr>SN4^1ul65`9uoC6GSWXDeL#ZU z>X4SsmYkLkjzac~mRpXZ_Wi~g?X`YHzL8V4Vyr4K)9;v2^U+gks(G!wtG-;DVs5M# zkViyw`HGvskEZc6=tHNX1MDEP!Bf%=-PCa;4QNQE=qt-ZPxYQR#7wHdukvem;4M7) zPvD%U%0x!#J~;^JS2x;&UxNnq8ysBovAL~1RPR;jGSgcri$=pc>e9cskI}k=_I~PG$B>78)gW!L?`f1ngCzTj%lPHGVKz;bL{{_loP2g z+mT~anGTlaWN8tW<&bE1hWF7FHcI`7eK0$J)>Z+D|g7fKOeEF7gTXmVDF-X}ydtdPa4;dS6CCiT_#FN7t889Vt7| zJM38rGj4?mFC)Lv<3TEgog)wv>1gZ3Nw=Ikyew%53m8^H1MAN27N zF^jH)YPmh`Uja?qZ7^tE1QHDBJq2zisK=XQ^XnQY2s)}(InvCP2`szl4|my0I3EgV zoyB`Ks8z)q(ptpp74>xWx>{SlP+J-;wYNY+O6bzu#lG8E@2cw9?Vam!1gm-?&aK#K zI?lS>8;5j_)BcTWc8Ts#ioU_xEGFN|6Dex9`~`uvMzQyEEl=Kwv18xlD+8DJaA7`W+#-r z;H(DGQ^>d&2EFEJU|IrR>j%&s*?BP)32o4v#bOS&D9|S&U%wbLDXqa$Hi8pB7w*$? zv=0*E+(2wg0kdULRNO`7AHzo@Q>vhh=Kb_`xS_5X$w>9OB3H@2YByBp=khRnhpgZ& z=Fj?Qq#K^l!)ipf(f%@W>gO!mET1gj{TKYD{Bzw&PM5u|}Hg zS>V~>-f10aKWA%heQemlfIYBpG1st{c63u;%R=(4biv=cN$vrrnu9L{3fDol5f!xA zMn+4jZqcjDBfuoX;+|Rp2(U+VltrYbCi6dK23|}o1;Y1@3}B_%H0Ya_DZ}V8{wv|* ze{366Vh4FPz8rT-Rp=y+iy>?kxyaW;jgEH@KUEAH3XHlX9YWS9=_Us@VO=K+#2q+& zc8H8P_g$eWn9DP;A=CjSdr_j3VQ|o`w4V4iacvilW65ys0en}+omT+PW0XOgo>~VQ!g2&=Eb3s-9m~;gjs<3{n zD*eD`(%QgV6M1#{8!B3F`W@)XpU_ZO1U6j&{(>J$SKgN1rwEsa193Y<9l*abFD4 z1|UJ>4ib#B5JJYYS@7LI_@z~XiX)yaLvLV#bLj%_OWVk)P*xnK({U>Pl1$CW1EL?^ zg+jv2>!#~1r0>pE?zLG2-6|2ErMb56@`OH{x56EDlstpP!$wJT5fxCNx2{iYes!wv~1|kr$fVY0$H^a zQDJ6-_s**fASX;8p(}>g6cbVdWYXjZLXw1Pbq$$XF>o)|U^l4=PVk!|h3RAx5?7l- z=e86xZXGtCY@th_YrM;!i{|hYd;tgFku~9Ka5wE_kD(d1!*SIOZ;%wD=qKP332F|# zuDPP_)mP9R^1im*d`m3=mxNoMGJny_+6G#>*o5=E{eyR$eL2vmSjRQD=2>lfWSMEN zW4&vy?DaeQSV~#zn#XEHxGk|}!`jrk)x1StEt8SiTO4|X5~4ADUzgxiTuuH(mmh-+ zjI}^tuOg?kz8Ea>(}3tCp0c^32z;wk(K8i6n!^Rm^GHlVp6f%L(cdUGB#0zd8lei`Y_r)c z2dEFt_l<-4AzMXbv~!ocx4VdSwB@LMqC1Z>(U#vn);!cX%~{kv&6Cl-&^{Cyhoh0d zK#XT*&2`eb*z#T5Eo$+Mn29&Qb+(Z&;BPRSv=*D>be4t3;51Bxy2i{qu(f3; z{0y+ad(h}{oA5~t?glFUKYkL<#3uM(4)zir`X*usu)#1Y=2;pGH~Us>3Cs+S zQwP2WNfW2(4}MHKavu zgX&_P>@D)bIN5o?A~hw=-&5avDdCQ}&DA4z`nyV-|ez2NXsia(pWAZO?Q~{vRf2jgkLxMi6lKI+=;V&z=Z?T1?2|WH1HG!; zr}@;zvJxui2R=euCv0#FMAId>^({OjuOx)1$u`q;beQ?YK<)-dbe`^lMmtH=ARUnS zSdecc``A_Xw_M6@fqUKq2kZwDg$*?v`3OtUr|*ZJHzUoXw4ztZMW6u5S)Uc$|kIcsT z=#7kxUwi&~@ongo`@x@g1guReQh3jbmeMJ*1K)V0_AoD0rx}J?jg{s7*jPDA9?(a@ zc|Q%@>|FJhxrgFxtig(_%46t{!|7rF(+qmY~ujqE@`t>~cEAz3jUD6BvZ6|nh4p}41ST>P{@S(h zw?Y7%${PhD5WMrGqDET`JdnomjV;{ zo99;}sHO#w$WQ~nLlWQ5CMcib%AUd{9}F%gn!d*;c?dkr55{phR18(Ah5rdHLNS&X zh~x?61wI7l@`%6DE^EZ7E*VqZ_)>~&>CrzFXVVjW#g!RQYA*TW1YLO z=Rf;Y`!44Z?>5H_YjfK%pir9~Yy4SVeVqra!wuaSYOmsK=k4K4fwsMdW4L}mJ1F<* zwYAA|B-_qrhC+IJH|cPN6o`8@gy+``<=U~XP|v(%iAK)C@g)s#=QC-_isZ?vFE{Zlttge`9PrF^)Ww&=qlMlS;8ih+CZeYvn^msD=KHO z$LSh8FC5!KHzGA)8LL2!&_{T;J|Z7%9(a;cP-3n}rf7DgGwq- zBn8OBLFg~D@?pFL3nO>64^B@VbSFM^1IhfCr|1>EhWvdK+!;@_&a^lm$A{^<{z=V( zNp-ILBJT+edjwY?EhQIbf&0Q^9I=+x|3=q!Td!p`oXJj`y}0j`=eGN*qolhbQsa}X zt?kmrgH;?e?OAMN%>i>`o5SkGH*$+AbnClZ!fSGtK{lJPtNwt~2W^GWd@}O(2ihV5>){_4Zh(I;Y zQOC*=ij6a^p-L_%hjKTt!aOu9&ejTb7X5Uquo*zY-4 z`|E_a1d;-8t(&Z$4Zo$fb{Ci^7XcN!LiNpjj#^Akkh6jE-eX53_89YYsq;61Cs)_`Z?6e)wyuc;&mMe%gg0y-V1{s6Sy8IU%V7yiHszf`kiCs3Irs9WBk zSAB&oD*>R87qBtxCMMPho@q{{2GF7TY#{EX7MR`IV*77|4#FpXCm}4KvaKAXwPo4aaMZKu@-!Q!=j2bcrusRcOxun7_TQaH9Gg6S zy+3{R0=>OI{B_(r)u-lM_OI?M;fuZzc4i)K?&z}nf}wvy{bQTQZ0m-%s3T1J&)kE1#zCMAdjA@2X9-3tD@* zNhBgmem$F^4UzSb)uM_2bOMy)jy}p(&-~2(N2qno%&5Pd#9zRd>P&Lk?WvaGPU5=a zzvP<7<@{%Du@LN0*8_{QI%Gn@f@FN8TJf;tibLz)jL zN+GC(Kd{xnol-=1@(@mv&B#nS046m%zX}c36%q^2n*z7s5Yk;aO?#3|v=m*$Qn-hI zMAFkiocz_;kC6i$Sq1tW%wQ)lC>fNom~3OnHc=PzRs&iX6Ec$W$Y$s_PQkr08w$je zJhxaWJ@Ag(!4>b5edOP$T`e#rm}E$nS1;imEh*EDBvDa5!`_zcMpp5HHob_(jC+N3C*&&$9S_X9k468#T-{X-ce?y>891Nx61 zbTx2-V$d3_P?E?JIuJ=&4Bm|@G{hFOy1*5G!Zp{GZ^C(LDNI0svTzl8uXbS8Y-)8D zk2ilIZ>(uzFW$?OdSiZ%-@yjqCz?}F!j@|&d7IiBSyye% z9f3Z)6bsbfkSC-d(WEoK%&Q84?sPJJi06?DDjTzwhtJ_r@a)$Bj`vb56K}zso?sKP zcjPE*2&6Ls@0J^ml7r;eroRzz?D=t5-VjNAC|`!eD+T)=132M%$vv=q4*WiafeQQq z?b;P(4e9V}PYO}kR%Ei&KstF#{)&u5Z~7Cc!(zPuf1nO6;V;;HXa;KVLRv$-y>6u> zzM(>Ff!GR`@F|(VB<&<>f^mGutjN0FB;2C3=%xDL$$BYPh<4}~CqNBdg)c!}8!hV~ zrzZ=v0b9v6ARD8Qpj2ONu6ESMYah&o%wBsZuMs;naemIBF?x(ESSQdST*_ZBG&9;B zcokafui}~SGe-@#%?u9m&X3!W^uYJleahC{{>AbS_BNaZZkItE65U04en_6=57bxu zF~5rw*BLd&iJj!L`8jbyv==j2K{^UqA`QW&nnVFQTl%5$@!CgrO1*RC05c6tPi@MnaBlz%$~=Q zZ9um2Gk9O|6xP6HWMEFMMdH8+rlFrN#0P`v{=`%HMC@HKqt|$YPg5RfNM&}EXQH3L zW6h?qG?twr+2EYHLQ5(g$yIV1oz`-a2dGL0wn~wy$(soq4A{7u$fzJkU)2hLJk z{PdaO7RCGk)G!{(0E4W+u7SLKC*KBd+6C|>Z)8s8DO-V#=`Rw;f+U9Sg-$Xf99pH6 z1|)~6s!|_X&V5kw&ZgISW#Cc2^uG0!-;hOq5=jbA;N5ztJVQmyLgSSIn3q=}>0tZc z)fs71Cy<2Q9{p-gZG~Ff>{g+Fkf)78#wjQ?_BdV#>O}H}(i6`{in!`~7I}icwE;^Y zA#^M7CNMuNL-j+O0~bAC!fBzX=&zo|;q@-R`J_I|P&6-e-*5SNoRLDn--pTt?7PTJ zcCd1C9sE|Mc?sTk!_h@nR!+EyhF1){ga%8L29(tMT#@+*MOWRb)9N z%MlEy2)>1ycw0{pGm>rA@e1%ow% z-AGMZiFXi(@ad)_d-f_{rX7_9*&c3I4`Ji-X0&D`RO^?Pc~KCSQqLK z%vII9y3ou<3;g|OM>qf1s7x^@V+X|y3orF8jxON0M=f%nbXmP6ea&O?#_ozA>gyZ~ zMbC-p7jQ*&a-47tHp3ikTocD|im!?4NZ;9~A_EZWy7F9yf~1aE#)2XOK6rz8CZ_Q# z=uZ5+5>zZrcuS=}Z^I{xob)*K`R~BLL-oU=_@7V?m18RM2Y>QmM56L97Ij26AR=)} zYb06pgUTW&xRXDThx6T(jQoquG>fttdjYVYoPME0(Y4nmvv^*5i@d?}yTr%i8EWtq zPlLy!5fok5P}@ep)!7DpNfD%9yn}Wl7Wmahr5bp#uJS)@wa-}*PtP|1a~L64ess)cL;950|W`~?hxGF-Q|6}HEU%i83KK) zPwlh!Z+l)uj`*9gUs4TAJ1b4m_(#b`$Dc{|CT?Eb;N%VB_NM5a)TX+ZtOGI-D5;UsernXnXlIcR#gF*=&lf0Hc(nV7-;2Vav&7qk~-Th*VW z*93a8$|auBb;Xep)J9a4Iiw#K)=62E`)mw1!9J>JW;IhYC9@gjyqnn85l8eI8?aT$ z3Gd>sNkvU#Pnfb~-){9MGa2OvgGdBKf@;oW}rFfQVQu=wRhou`AO+*G zob3GANS0JhM%xie4|^W3_Za2V5%PxnUM^uWcmnR9il1k#?V_i61+0bfUFIesd7&_K znQcHDw*3WRa4J}a~Y-j@LdhlWvLQNbrEj2Y48U*c<%$MElI9P;Ts%Lk!h=sJ_-x* zNY^sY(c7nkOZpSMkQJ_M)jsxm8lL0gcQuH=*h0{^)0CdM*4j z0>82oYHC=splSZj!6q_8;0uWtb)vq70q^1SeBuk83`_3Ts86cuqA9NFSA$2 z%x97dn0l(59woNoW=t&7>P@n|hRdT0m zW{OH9r;xy&P5o-$>B{Ped=J<4MN8Gl87n)GeUpsD^-D6uq-ICm6Mfh1ARDWz>TeW) zXT4&&0?OCQxHEfk9;cznzDFW%BeB|fh|^*f=}WidAM6_}Z0g&xWCpENJ5)0pgW{!x zVe2{FNxU7amyzSO(o{1G^k2*odu#rWccZt}Z4&s;zsUO(^mpii(AI%U zLF0nU2R(B?1)mKs6qPt`P<+bRU8!@#ZivekyDRKsOvad_B!^arx*0Vm`Q>Cs(gdfA zOjSR{)0p=0u_>>F?g{K;GsHCfhw*{Jwg;QmR@i}V1%F4pSFdy}8)oZ*^K2)T;TV|q zEs{OHlgAmXqh)W1DBPEUXHh$>K(H=wEb4NfJ5 zbDRxF=O?inCbqHK$eqzx9_871VyqbN|DjNytTQrav_fwcgEIB4Ed_tFN}k5AT3=TY zC&UBT#3phYTkxhcOSM!JLA`S^S*(GpXrrbxZ8l}@XhObeLlC|-bbhbx8{OaJcTwxn1Txg@ew*v+W8upv>+B8tXNO4d96kCgvQS2|Vy6nj$TOO-EqrRbDl zMS@-ixpu5w?oaRjic)2j9;I&L3(9M&yN%r!%y2F6^M~LO?%-_&^?jp{!3N#3J3;y# zkm97I%Egg6m(6Xh6Y4X#FMicmNa*dOm$4E1CH?ty87^Ph9;Oto;O%;{IFAOqtHjV| z+sY>DFIifK$PS{vVE3Rrqt2rW*5tjNSGDCk_qysVBaKAoQ-Mstf7KH=@gWfVLd6l!_ryrecf2$7G|Si|bdGfEMqYm~`r%$tFv1VsW_Pu@ zX})-iylHlhyVmOxnk%$baMp<8;psxVhJFow6OuS&RMf_ZOi{OE)5dm7@mE~AP@F8G z_d~|Umx%Z;I#JB1k4*C|sAB6Lv0miiB4zgL-eK zSp-L#Q1!%59d5qELbq25&;efpWeL+2Pz|PIqxD{%%5*W3ROUfA1h3ors;(|6x~fFF zAxM*_PpYl-p?9dTwP7t&flg&dcd%Lft&7Qh_=fRTsFC6Ze|^MOxvZ*}E@exTmT^J- zht{F4*V*PVW%+hqqqA-77SQcY&OloKDzAZ^?JlPSd*!+|hq>W)_PXn8`c9y_ZR2&c zBkZ=o*|0!FxzO9u6~iNg>xO*@-xF~mvUYUc*tyZU<3hu(N3V+*9+oTQbj0n5TX7qb zwu~Q=yg}NF=?*7b6}JH0P`!w9;NCG7G!LZoJgD2>dcGlj)?C!p(I2iO!DOWUoph_& zAQ5f7Uit*ykmo3vqD&Fo<2BF#CFf)%1LFuaPwh-oil>Gmi}$drDdwhuzse#<;i7yd z=i}Wzr?Rona4k7EJ7sQ}*14(1l0A`4q*YZ#1~ZkLc^~eWg7O4B*gf<;Q(&t?>EIlF zRP6z0+>9!qg&HajfQuz!N8brIQt#F$%yAP*k1A1NJySJMuhd1iGSFlU>aUur|JXZ} z)v&oMP}~H}HivZJaT+ko`};C zlfo*5w~K5X*(5As(oxZ4qi05*iMkyv$7=@ZTrg667InF%y{}-stISm%hiu+0^b6U%^^asc-12 z3X{0jQx?;?MSiluYdTAOmz)k>Nwg9@L2Qk>MYhAfAJ~lB&g7<|*5MPynE~{V|8MA#~8G8Gn5O4vBd8%!5%huL4wPp z9l2uC*p)iUUbC_O!=6t+w#@=R2c>XZd+~0x7aUSMI5=!?NS@HV;cY_N#M}`>g-2fk* z-cC_*9Q8p#RbJlI9YCvt#ZP8{N~yPrcX}q@;5NG*m0-A>#5}x8-J_NyF?Hyy!nxaBZiMwZJ9po3&3;2Pncw6neZWhsFSy6>i1aYE%m$LC%j$=2 z9yeH?M(LaumVTt^iT`ApSKZx$)?{i({jiB)%RaNA4a7VO27p=5em2rC?KP9Bq2Kr)+8RPzvdHxLI17ek#iRj3T0|E6r5@U|ZCD z^Uk`TgVy@L`74CyB}pJIWMWj~&~)K>!+J*kl=KuXpo`(hBX$SJhD1f4j%gHmJvKZ| z%9PVmUrTm7{9|PQ;7?(jLzjkc3fkfRWjlHQ@>%BDE4r=OI|!@K^avZ@r$A`j<&+#xsZRQc2zBXvSukV^q5*dYk-R4>ehJ zIrj<3>^?o56ShsBEQm`?If}U6{*M#%sE@xT?;Py$;}Y7BRE;m z!|)s7M@K*Df8YCTA3UrD*?4hP-=-VNCEwHA7Q!K&lCzXjyzxe>_xgq$Cli^!)iApDcRa0q zx-0%ZBhvfci%rf3SekHe1z7(ZoC+gVPNPA%TF~E;h=~)n3mZ+YlTq-N`E@qT)KFN} zmf$tb)pYLqlT3#J{h2*Do2d5jc0KOHhs+@7n4@-c3M!!z=mS%>Rvt0k)Ze%qpXl^x zp&m0oopk@Ff3bae4;H)G^*uMC|A0H!t7uZ&t9Z2g2bu?e@LwYV_gnP$=n*j~!b`+< ziz*nNICO8M4E`@9b7=pV;>rF_b}710(r?La#Px_VIE{`6PYdKQ-`y_mdc12*G?5{C zvi*q(q=5PAT}Cs#*QT+1OcD}~;FNU0bfB9qr{0?imJ^BQK1O$iow;K=sW$SU`Yt+H;m~@l1LK{@F~O;VPKT89_w<)_|K|=i<9JeKbQpcj^`KZcr#p{bwa0Lbv@u7S z#HX5ibX{Z32luLaYo0RO_q8A0pY%`WSN+PL$dD{+XUbOAh;1Y&WrZ`nthZS9Z{p}ub-5sV7_;5jW%(9W#&Y*jkY$IeFzLP=x zZadURdycn$w)%_h7=5`bDxwn}ZEO06+njDH&h-Je7HXHB>}(s0mg6NI%xn7Zdu}7t zEboG1g7OF21?mJc2c-!6DPnibZq#gv!ghr(2@MMy7iMFV#5{}}6S*NQ5Pcf9c4-{gR&`)0m(eEf%ai3&HWkxqdSM?W4(}L_#n9QX3NOXV|{OnAZ+i_CA zb`IlU6(le1b*JD+>g;wjGs$M$4UgEm#1m*>H1v-Ts4elL$E8=0u z;ppa(6QY8{W{0MYcpW$$A0BfgY1?Eoqi0482%8p~7pHYN^`(tH<+iqo-1?*fJhy)M zNC#9kf&0ikrFYu#){nNWwf&LRJPfR-s4C>v;QvWtd@{NCWOsscl;Ccgq~DrZ=-KL; z3pju#s&4jg)eaPN9Qi1#aHZ|lDQ%qYAexDVVgh>L1HAp2omn_8#>#+RYCE~ZQ0*1b zyYLrp0?nFiiQW>Ei~* zS4ir`w2H|Wz98gE_^+Yw0;#=W<{Iq(C%?5l$<*!WUqL2GL0wO;RSp};-_x5{b1#x* z)78u+RmP#$Uu1^UpFc!NSy&H(VN_j zoev7rI^+_bQ$55h*+u7b`jA=t4cGesxmv%`i@X>T+1`NOW&z7M!aMYi&f$^r!_RzC z^;CQMhX}P3ci04&$M5i!b@ku!53B468?SPrDkw)a?P_0|uAb}f==JrN1xGsPRwD;* zvwy1XM`CN)@CyFm(DXr%LZ3v93yTkX6rM7uOVsS}3UQ;7zKm@V9vZbL^jv79ze}($ z5arJtXzRWw|LKYi^;%Q4kDK{05U;)D=7^ewQ&cm3&aubk3-nG!NV>eME6XS7rUW|wQd`H;#iXl1;ljS({z;saG4E;1srHjsn=p6xJ`ey=FFlSnj^Q1Q_gtj zXW7F^CVmnJ-EmC3KQ=`#Q>RdLXHh+PxBr#@;F$f>gu-q$=U!iCR--m?Wn1RxBKi7ntY?S8j~z0j>9jWM4WLoKfUsWy1M}+ue9U@Vz`bragNSd}VJLoDgG_AXzf*wN zB!eqVszrb;uzw~0=`!Gn34&52^b&D6()rt-%{GMl8iOITU{Nva<_aKwcP}V|q2Nm0nCtOVxPv zZ2yxh_(l)ugS@o|Y*Kj$mS#P8SPpuS&!j$Wq=!8wE}GivkzJ0WU?E=ROzc4%h)S!M zX^w+nH~yfz@U`RZaWub0nHSPg7xu&bmS;k&ZTxz^Kh)lV15PT_nP@opK{m7dlN;~l z3+%If(4l>GkFyEnwTTR>;h*A84UP%9A3QRmVQ{+8;o*%#o`<{(?-ep5EJH+mcwAiC z*z|GTLTd(>5BV1-R~j#;S0&&NUg%A5o2!2KO^@25cx{f#f;uz%kEVh2jW(s#Fp~|m z{w;IpPUiW?rj`4*dJpG30!>;~%~l{aK{fY2sQM}+x}7{W6n^xG+@hYz72tu{&2jj; zV$`}WVg`=Ds_bX3?3{H*I%Px_SgqS@OeQf-9>)J$LuY{LN~x;I zLu!GF;ttAAy2eo$n)KAmnr0b2-9&Q4T7a(>FzwtEk3e4>O)kivH-LX`oK&XzuK*OyfJaVLsU30^8JHSGy6mk=hAk zP|4pQ5FWHBFw%cJD2X>Dv{y(ge}Ik6QK4%iW<(E<9U3(!I8Pun+)o85>t6JRqxtFY zCiC{g_e|8oY%Y`8_|QhxWZo)G|8fs3V=l8mdAQ%lO4=>r6^QFsIIQn-tNv9+GZ(H$ zX+6~q$hjH^5kGxrG<{F;@7FOy;7L=%F+DKdm_;Xn0Zwox|9{@fT+z{a>pSAC_TIYD zxY7SJXVJc`QooSuSQ6y#Z%$kedemNWDwR4XUFs+~R)-2I2UFiYQlNgL_bur*2j$tQ zFUSqF!5hX$IuUqk-%4*PS4EFrCGSKw?&)9|$6 zCT@6GzNmf?%R`z|MRo_82PN`Hxx3s+?kVQe7vuoO==1P{50u~RgNGOlm)b|%<_&3N z?&4{Eq8qt|R1R+23%pI~%>S5%M%pkC{FElW>Wu#9qup%6@irA#_ua9&ob3uj)ZNyX zOXVz`PnF~S|3KPW3)rTq&N!#3^FOdFYuloU`GpNCGxRq7w?3iQIE`f+y3w{|F@E8{ zf0CV4A^6vGavaR~65A2}R5>XWl zmAW2S%T%=hAJnZjp$occ%P;{2n{Kep@urS@ z%|?5b+*aOcTQ;bc|8QvkpzlF>LfVAxjR*^mjTsO#B&>5pi=e$;0)GZihP-e$nGC!M z+nB>AG6{~-H}q{ZYk8@z_i*w>fO7VO3+kx0vm2-)bNvBy)49n-4=Pdpv@$7l zH*vsT1pla^cFV=aC6gj49pM4ADl3`WpR3`p+LiPiG12Mb`$vR2OGE|dx^SHcXRxho z5BW3ei}tksLQnBpt>qo)$G6&E*Ow*5K)CFoFgh`+mx+U=8KBzBBtJ5AbR_8SBTm*F z?!`K&l{2w5VhPCiGRs)wKKNo$j-z0`nImU*co z<=NfTU8kp}_7joLLH4iob2j=~JB>xHz^~wQy-51aXELZL`Cd+vhw*qXCB=1>njy#H zbvwh8naZEpU6LJQ9Oon`N*&&aBzmU$mHVfbX|5XbJ>*fZ^)XP>U>rG{O);3YG`gi3 zfhJ=NQ|-U_h8}7*7OD_?(Yphp7z=wi3zq8_c+TGRWjXNd<>7z*r#I1;)YCoPoBkL4 zWP3dg7AO7p{8PPsR=JJQrfdm>`MZRr_MZ&z8~syUPa5IV z3xk_3bLWwecptS@M=jCpEYi<)8k5>>iJHH<8Y8!{@2d1ww6(Xmplx~c- zV?9ciN;;I?iu=HcZ(z`rPMP`sH-Y!-MFMR@k;=C{%FM1*QeZ_>+Vb z3%MK`5%ouOk+`8@14B;)mkgd_uen=oSFnZ`YO$Uvm*H}11y_+BMJ4Hd`mp@RTHOET z$n)MMHsJCbD*ocUl#tJ;PM6hM`2RTbuRB^7Q$f1DsVUieX`kAIbV|wSw4z{BUWrd+ zsXjBU#4;HW`PsRAP;BMIMu^4EQ0FmviFUT5chS9q(|E93N9{L5Ip5vr!tSXU*-P}p z4|^K~@FrS{9m=Y3y3@AIYRTzV@5r3YPe<))rhcEdpFVjwI=bE{{x*7rQR3~w$@mj) z%?R1a999!SCaRjGZcjBz&o$%eo&N^8VRsrz(ola0n9^A)%24!$uS__K{_Conxvc$Y ziEdMy4w=j-pkBBm)d+6!6TwIQ*MdI;rT1U=)&&NH4GGT^+b67RaGRhMfnC8{-Nhz_ zO~>0ZL|?G`dFx8xuX`(V+vGg!@+Kp1K`OD&>|uX$GZLjfO3efijk9_z{nb1bXDWk- z){`CSU`Ekpr6<3gWGE(s$6; z-bn%`@3W8n7hOM|^!5I|a=09(3sDE|i#u|fIPYvgn^sC~5JkvuzHW2Lwlae4T)`@X z&cucs_L0-&r*ot6C~Vd_Jf94r+uep1r;Xn3KcWBS92R%$f!BQI6IIk(Y){kP%+@zZ zN9c~~@hUgTR=m3BnW~$4X=*HE#&WQH=~e9Y(CR@zVwEWR&m5@ z=`S8qEHK+&Epj(u_a(w}hntXU>=q99wz2Es*^k~zwC1*dF7LBvuN>P>I;k0!m@hz5UN~h*#KSY z6}D&n*h-y^?E3d&y3;`ToYb<3Xy~LTN$rg9zB8Qnb-w+}4puEWkv}r=6T!BOQ483E z{ea!B+eA}2h5e#OomXw21g0{f0j)~#!%iw!28YMRJ(aWf7z$;e-IDHWZnGos8|8Ejoa!^+=SG{!;)f3~vl<|3%k<6(cCT%5nuyCwu@|s)mKFyIsNHOc7_L{~Z ztf-jzM$2$Ep5xEkXsVh~@-i-%f9))8tGx6*pUfvvmPY(t8uT9j(*f@rJMQ=3tyf>t4Ab#)xhgac;3eoJq9nXcd-=>kRcJe^c7f;GLzv^quqxLI?lL+%}So00mp zOo2*kuAHp;iXm(bnkXKM0!|L`x8oNpWSG;?DeSxGAFqqs;jp!bRdsm9V@?-P|1+u* zGiz27EQ^cna*}u~rmIvc7U;|FMN7*tsl<(pg=)_v`N`B!#MYP{cW@^}O zhJr#?r4P=f|I@+b#3hBNIfmzUDe=9s9 zs9@lMA12q#a0lqB^bW20-foygU?n%nN_sE*g8{qr?-(@q52Yi&cRHe={C zzNzwbR~__2ms5^gCyEX|#GHojnrN%i&Bnqb{Q*A|;r2Ia^)Bn#uHGPeqh~0JJJ>Gp zh>P42=u+DRh6lO+DZ!m0tk>D!*WKhb^w)&j$xFW)Wj5LF@*}GCM`{U^c58Xpo>m8W zzw61g=%&ghuANmW}=mj|r|M~}#EnniR zazNf{Q#04{6J$p5exDOpP~At@aLn|g7fr5q(N{0fY2-C84Bz%&W~^JyYMlnmzB_fg zu`^ijwW0o_ZWB}79CFv2bSBKJ!~FQdt>Yg`Ud9);yG`@Mu=-O34tV|XTwgUqz`xeR ztl&_5(rgUaP6y^C=bV9k?JNmvmW5gvL z>~#wi^1|slLu{02O(n=GZp!bl|E<&jXO!rO(q)TW4q7@-T$RIl0wYvH{-k2!rFv_! z!E+U0@;r{)`+ssNNf}d3SALpvq}fE8yQGb!2OAn=`m0~u6M6~vdnq>qp2yC*j`z}J zLh(I-jm00C!xFOP%b2IeBSmc^8PxSu3sgOeWl2?8)kEjF7-jKV@QwL4#9P4Kw*>Xf zTH8BN(A(x+@~-(mk!oLAZ}pn638n*6{7g9K&GrgxU0a*Swor6*SX9RxSC^ZeRwWs>hXP5wBZ1UzvA|l=9xnzad1>@*J6auM zW9TIP*?RIU+-hNFqwA!6K7h^32#&T$c_dBmMIrgO8f6R6rLTqN6sqaWDEc7a=} zpYF>4`bn&_ema6ADy!}WYqFY&$us{k{by$)-{TIk3H5IDNh#g^_N-aKot(wIp#M3D zBjF!zt-Yu)is%sKxA?W0FzgTRn~Cfih|LxgXW9JAb z#8s0_SN5~82iSa3pWvnkfpxGSfII07-ke3;HFLxPQ&ZPb9$is&=M=kwW;^ShM$SDa z&Kdk;->?{sD=@-Y3u>L-o9edY?qhoyGsi_L$Yy^9G%hPh$6KfVkWFPykzS4y)zA{e zi9I~o+*FupVjR7c$3EwN;J+JGTKQ66S9A1jw-s*0g?1d8n-t=lOy-4vm_|^8Q>)CN z@59^_AV_;rDxXu6^;!LpJE0RU(^94+O0ur#Io_Ha@JDeVUPHZ+wkt|g!LJKe%gr`5 zjT)R3X78>09FDF*-~)Qw(>C7S@4sMY`-ALoHzee&T@;)pC=_K+XT1B_aR62$5#*5h zZZ|SneX@;gKGO<}yt$b!`+=@+kXytdby-Y)=)|i@r`LrwPyaj%evd@e>b}`A|xaM|E7& zw2{ZTLCcBtOv2gl1^fPJOc>CFC&=r*bvKkwcA3r_dmiby)e7^c24PSriptLUTU>>6VK{(_ZK*? zC~vjDI4KIx>;)Vto!Fh!!4%|{Ey8={XXnNpo7GKCXTMmzU?$y$d-tL2CL5y3{9UEj zXH1Zdk*8!!w~y@aYBW^6^dx--RcUGF)l0IGs4v&q>hiMl$T=CJkrZmlcx&mP-l zR+zuMCZzccb7%T%x!Y}iQ_25dP+5~ZD3LeTTOYK+Eop0@h%L;<`&&4{{?WhN;V774%Xk;JV%eS1UFcIwNB2FwLp)0fe*b$BUp#G za}DV#D^#R&7xp?eXKSzTi8Dj~=6mX#Wn=IRRMr`pU9&hR^c8Q}Xq5V&9P5-yyp_F(gqc~f2P zv+CS@!`wN{PBFTj>C5vBlQ-$C{vyAjlhO9HyB*j1H8%@>?WyG9taB&YBmQoBdQeGr zLSC`i+_=DYI^5sXH(P+4Jq8Y`95>WH+z#K-U#~O`{0U4RDsDykoa)peg%T~by9-6z z0vy_RKq_i5%M1eL>;mT1hRrkY%zi~Y5qMy3omC9urfaKaIgfltndNgid7aX-j?>%s z(bvPtD%v??EZU1Z|L6thl8({Hw=#s_?(0~0-+{S5D%PGp1q2HJsW;oU5R?%CA zQXLK7dw#JDysW>RZ6f3_CaRrcBu}}H+^@>h9fb2t-{PnwIbSbEJ$h92)$`>SJXt5r zByW-}hjMWTIU{Y<14S0HNzYw|K89ZEo(?B}r;KdMo#onrxFZ+oH)<}3LK|IyI(5;e z1_vvHqH7_EG#_neW{rJ*YexFhQXRT@)%|G#i}`lC@OvJ`qjHT2DiS5568T84e#d`M zXk~WmoBX8Bv^FPkf-Xg0-W@J)s`=Nn_J8rG!>#h0x0IC7qUIs@dL^%#=>tbK(+;)S zRTJAl8TCkPw(0afke=7Ft$P#?+mBS9>eQl@eA_4W7BNs(Q3}`1&+40=MlD;TE~>h) zT)(Q+dLyXOblpn*DXe?|^A^etevoc|f-EeyIk$!5yXU(}udvsd=qz;-_}=+$gDd!9 zqU(Z39<{ej1+N{R{nT=dUaqDXb}Txd#8A%r2C*JKFj6FzO+`k!tGQw|O4y>HL5b8h z{`y`um8G56T8R1l^IyacIoQpq>EcW(i^lUS2}~YN)Lh6 zJ_Tc2)?9FZC}Z+)e;0+fS^!?vn0~#U`Gq@K@U7hC{0!0amz9M};^YgU_honNoTBeDbRy(b7nLful;lF#Tw2IF@;s^6*JaPI*% zK$j#hXf|`V%e=nbrdRXz7`$Zf(L9gV7gP&TNzY_1nuMdIK7CDY@jx^uiGC(K#_l*B z`0H%vj@;(VbWVu%PC_SzlU7uhvp5e;%^ebRrrWY~Fm<@M(#Wjhx?X@+V6sdqKBH-A zqn5El!>|vlJ6^UQ3~x@l_%b?1&T&?VTJ(1%We)Ms`9-!DbC@LdFxQ?ke>rt!60~An zf8eaHWgbBzpjT68tEu7IXET~_CN-VpVBH@~cDqb(FPIpk{qDkl@|oozqh6md)AZwn(m*y=@lu2=x|UNxC>L zI+A@qh?+hOMZ%91+^_Ns8zmpvjA%UETKPANC4!Kx`7(@R+dmr6#ILWj`(H*^LGCAP?fzQ@jO-)Uz$+SPqdF&XYG zAk${EQ_h4j?OY+zssvNsS++pD1q)wEZ-2uXk51#e*eOS&e5s2jt1u3h(oQR9GvC^E z@w@XcxXWvq40pOK+sGMA$rb5Z#xjjH1u-ZpqrkW`$QnGC?YIkXQ?0&(EB2wc4ygNN zPQIb0eXwa%GLwYfr>knldtMA~>2L0?-SjjSLDT-!``y)O`=i}Vu;<H~^_ z<9IVa(|+nv3$zKjh(Er<*O{^jChd8*VS1tY}j3>)W#*J}p)Ff&P)6 zw}*Na&Rlj|-(VqFfsB>zhCHYC02j|+Q7Qjc;G_BxX=YejO zwP##>VEP0-LL*z8UTKND&^(dKq*R4$YILfn>|r-8*mgV6{mkU4=GXH;XBx?eW|eM= z(oVsgB$p%TOHR=B4%f-lcf}qnlqsX=c@wLOr1~5~5%9`Xp*y@xM;S*p=s-B3QpQJ( zYsz$flUXG@T){kbS4mnbKsHw*k#71yhnvd~(K#+0>FRViT2issJg+vE5l#CA}%7sxLFimd;f% z0X6JvdfVA@nEVBOOn>UlEcQ1R60zKGQ{-yrF~Pp2`JxvE&Iq4 zI?*HC?AvWBG$18Gm_b1Gq{b0!> zRXUKHqTsm2dCp4R3*n~C*cViOf$?NJZZ)7$Q`GGv2Sls{Pa85j- z@A)deJ8R^0l~g2ghLS;X)_E)H3r8HIgAHa|&?aY|Z$7uxL^*(oq_nw?LwXm#&wr#> zf5O$>PqI@>6_)wQS^DY!Gextog>9Bh0D8VmEWo$HcLnb9P{hHCb%Y0hL@zr8=X@ja z3EbPra1la2$qQK5rSgJoiL!2&hy*{Vtv0JtGB@*9eK6t6%-PLIGukeW(@pk+BU@*K z;c;tlDhI-awgNGTbuBwHd+O8l(u35myxsZq43kR?SN-gd)VzxDZ1arAU4H}ayo(+} z*E~hPvFpT4`!ASc8hJ@A^1d-SbisddfHafjYLMybdT4y-*y4I0b8}5yh+Z9bPF68l z;IrqL6ta??uYS|3O)L4c7%oGc^Q6|Mb^dTJIxJ5S*PL>A*8XwQI*EOKeY-_sG#1I7 zKg1koy5)DbmsJ@Q>>u?Z)m|>brGz^}J?A7emWNbbxypI&9G7`jK4siuYzuLmYh(*# z1(^sEN4X6i(r4!&neCi-M$V0P{-K(_B15Yuy6(p~V*a9&Xe$1ZQ`CI5P4z|bd4dyJ zRVGJG6b;IL9j}O!E4RrlZZ|g_$Wjb9#w&isd3!>p=4P)T%b}*7 zCm-5$>M^OiHSJ1!l#MYjb!qDKO&G9gr!bRsGEwL(6pG2+Ji%r1G?-r>u@60UD%3%3s0EA2nYu}y&nvl33==ba3&cjc z{p#HJDIA|~hm*v)L0{Eb)NxwF3G^53d}qnT8?KGl$qIK7bvZMtpxZDur!<)pY!_M~ zyZN4qLgEY=*muQ9_6AlGM$DFlhCKyytY65aTO2Fin zL1|T%UUvaXmaQtUDJ9FHyxYsn(n7A(#q0sp;yXckVF1yUe9@QG4(`wathSnjYUmhg zUsX&_T>m@7U8>0qH0KLs8Zgw_&MJ{dmT>Y4SB3i?Ixn4u^hf`5X21?!5HVS*1bm z+D{h5i;$92TFY4mVi}7vW~I2v-q8!9FD%&x5iR$Ef0JlR=T}Vy(|6@S*Qn(hJxJCC z*()i^$P_Y-sKD&89>n)Y?&EH-jos**%Cg(5DrmK(Uy76$)CXPG8-(idg?tav_|%3m zvsE`?x+`~kebCypbQQ;Rdbs}1_?kD&eKdTksR&9-C!fQf$`Z0NeJ1dgDIT3u}60r{) z@hyoOd3m1C#bWtUbT_HUxa;k7g)KNH;_2J7q2Q=X^-d!i(+B+OBoN2tpH8Tg2iHti zIZ|9F(fph`PaXafop@z<h3t?zIw6R4+S^hMa6>F8lMnUd&b8=>i258G3e`M9M{Y%8h+wmf}TGrJE4 z%z#{OGaFTAlu6CF$HuC7SzB)4r%j@ZGie{!&1DZXrxQUvQ8%hG)Z`1)v`pv#(tuXy z6eI%sPKiOB*pbc)@t62T)b_39IahLq!COVM53Hi<*PTu_z`>!C;h@)1A5EZxk}Osm=jW ziQJnZPIa+BB#=2!6fb0g?#$`_o2}*lb3XH{E}~LOf$FO%`!gRn<75`*gpNGh9_nBF z7jutL@JRZ;^OSDqASiYNqq)~=sozl@jDz31OC3yN`>Ft4R5DIgJYIlUwcTcCDr>6p zfje|(8p{gD-is`X2HM~Otp!S1UY~&NSck828T#+u>ZSe-c2%o|qMI2(rx3!Fuuty+ z9sCS_cmU)q6@E(`D4f{Tq8FWHb#xWe=~u7eT@A2@Jw#OVtq?)-i4#wrichq0^MR+Y zbwi9_cA<9tCQtL;Tp@!g5(GRsiuYP{tsUw1v%(HkaVCnKD!FV(rp*AglT-Z0caqxr zhAC^II1IO!N#-XxrzexZ&vXGL#Z#E_t73*c&d%ba&QYM|GS|L8lm12|1t^QPH=$|XP;d&s+X7hALn*hWbq>ftg-7ZD1F^{y8;XJiz)WKNu z(0yt?*!21>Q`H-8&Z(s5tW+7?vS8x}O&m-rdO1B(&9hByVrIK4su>tdS>E^$VhVF! zDtXK7(hp#=tEg%4^F5h%j!6Nk)n2SXUp7}BWGd8jh)dXholt)8-635mtCN%dw4Cpm zGu)Xf%CL!b8CCX@NGpVMlQi38evditDLpT@9(Tl7^;}j^qfA;9KJ$4?+t44SmqkIy zPKuoCfj35Ch_6d6WgvwFRoITuX&BO?ujbB+#@hvt{Zp3Jzq!p^iw@VL=B7rq zftQMtwplDQ{g^f?FzHkxXSE+UN^d(xyr+lGDC?+4s2%o!0%m19K&I&q!?9T6Uu2YEHVTE&oIldP2)^g{KZ@k#y%twox+LX3$#5dI3>EZOM zsLJ$FL#UOtwC24&js7JQ^{WglSXOa}-o%QL%uaQ2#Qg&z_$T=PE}2?Xe*nS#qITh}NUckN zy{8ij}8qs(aM$PzF>K4%1o(F9S0Q*?zH^_WQNTL?y-6{PhdyDgu92-bEgpk^)X z>|!bz49~ucbfR5MkYaXbL96Al4u|^E~KEylg;6))!>rG|zAopD>S_ z!R=I0dZZP6bzaD!&J)ocMZ;WKO1uR*IW3RbTHH|M;WvGFd0ukfUg@OVRN2%?5`Kbp zCNm&^dGvxl4F z20zgfFo3M80m*^S(OkbEC#)c9vgKy1`0*!C(0Axn7Q%8>bDr^*WfeVT8JUC$H4jY5 zGT(b=g)A)_`o@TKVg%FB3*Reeqk6|oUe?5zCE!lWnbp$EbRhou`MIN+@H}p+F|sjw zE=7cdj&aZb}4+!3qLVy?iga-M%0N>`c&r{@+F zZ)H#<*OUL!k4yv!f9YHRr%5A9GH*2n<;6oUHiCflmDyx=?SNV1m!%JR+HdERB&(KyH{;X7)(@g)25Jx)L~{fnNd zcj9A_I3p*6ES6{5Z-_d0HZ0^#rv^XW3eiVT=QNg)BY4L*ljAm2RMT^mk3Kbs)Y}mv z0v%0CX4E>eqM8hDc~O<%33g;tsi2Z>QeCLE?{O7fb6%2C)La~ePj3OURFYcqK;@N} zOdq)!)_dX)ZLx|oex1>+BKx{cR1N0P0!#=s9mhh$f&)ql=q=L1OVGO-iYTBL6u3hUQSYdOm)?aKiiv*_jY?zQ+GT7VQTr5b&Or7H`oP={2h<*I_7f@1E4 z9pb)K9n=g{RGpze+6u4N2wcdI!*i5u35tHwovydTn6C%N%4>s6ZCRDxB_H14UaA54 zr}@$STm=#6FMaAN)67J@O%~vctOC)>tmdgUb`w=9gY%F2S!Pv(M2sv;Z58s&o>Dlqeplr{_Fm&m{0AJiuxJl9u#PvrKF>H88n+yp{5;;`J7TEp zP5N+SRh({mH(8~poPA7TtMJnPqXiW;y_BL0^V)PV-sJkBB}EN35hr9 zt!lZ;!CG4CPCVD#U>^zSM>nV&dNFrwdvni&6X5Tc!kX^Wk5mr+O{*W#A&~+kOHoaF znrXTK=*t2$d3(5z(Zix!ye+<}o&sJBdTDaisOMOBo6)9j)WQ!CLuGS|Lv2Ekva zf?;k*Pgn=_T4QG~cz-CH6%&KT|LkOkU(G;uz2xiZTY#ITnv>H$v`;j+KAln0`qxyC(80t^NEUxb^P5%=KZ`(Og(;_M`pFg zU;%CALs-0{`Yza01+{>i<_+^yu-pI^^Z_+N9(vq!%%%N6&NIr>vNWf>Ab3z0rrci4 zi9b~H`nONQH_ zvQ8qm!TR7)Q@@LWPCxkOhYpF}xK#@{m*qz8*3C|9PSiA~oNuBNPCa`~e{&Mm#RQ(m zB~wVf(LZ}X^4>ko7BA9$cAMlXscwq@C@G9bL$KdkY6LS)2In}N@iK|d)YEgI3%`Th zRwc>#F>`7H@<#T^W6m)3)Oo~r`bGZ7S*izSaa+g1RJT%_#Y)*(%)-AEqVhQDxyNog zIc0jj?KaNu@P2ieFy68Gd5zj3r|U7gotO+$evxlFjEXi+f23>ZZ}Ku{HCOHNJk&)S zAEIhGt=#Ol=tt{6bsRKnxI*It0XH$V%y%~`-n5~wLxIQf|kM{-9y&K##Q z9ab|DEtZh9@~2bYH_z9fn{2dii__DbAZ9w0Ni@78813~yp?-EJ@eOX%Q6GI!45-pmXKc+`}4bAw<`pd)HdIhojt?1!QrZ4o6^W z9nc@CA0Ue%YYs57xj^Yk0(ncPrW#a-T>x2i7Fe;xP%SH{C~ z&P8Eb!O5g#vuY}Jb&vC!es!Hl<}~#^cM>@td>5S>Vwaw6YS^vr5E39Nny+qE zJ=R9(KXD_cHr+rKd#T6bEVJfIJr%_=y7@eG z1{s|U)QYL_BI|J}{KzO{Zy_G-0;+=A>Gah>qK!Hs>WUA-)#F5z%EVN*Ul!y}T?ooD z8aC{zT&S|q-5!z$=yJM?4RqeGx%Io?%;^u(^Sir(=Nu{@!5seBMwN)^$I9ZSy-tf_ za)xxsR&2z4+n217|Ixurq;>?$|Lf>XgR-omIBsaqJ$HE{Q$qtXQyh()jBwY?%xzR0 zbprQ6F*08x#SyG2j8IWraLJWM+_%v%Ld7(NQJV=Z(Fk?ITnG~lOihcD?DzJK_X{)6 z^W1yxe>>-H1JeY-rh;V!%(pr0v@MgTYv`xgNG5TaZJ?u3+B#CpZ_#zT+`OhoF(0{^ z;SOQdL-(Mr&O{A}Lx+o%tzi9|txhl}px({ni%;gSBpqpzO*MUGVP>^n%U&~l-wYI)hOq1h_-6Mzc=lqb6jKuj+5tG1qMms^U%f^53RA*|<29;Z=d5?(z&XOaeH$3Hv!o zr`j}`$_np^TTvkSte0+jHW{xnm*Y#YDUxMRm^?V}U*Od_ZYo%Q6CGvCd1oo4Xw#+8 zg@9<9f|**g9@f*RM)xXHAU2rYrqFfP|4^InkPsXI)@o#?pxKmbCiYRKLwJLoNDjOM z8cf1vPQp!kR_`$9IIq`|{3~FE?!cKEukLzfYM@sFTZ{z3Hc(UO4C?BYOR|J`Wn`@? zc$Xgsf9Lzm+|v>4w>Z}T1$QtCUoFnr$Nlua~SJm%E|XOQJdHj!IMVo;T4~ zp4Z`~nQTIT*)6$bq?+r_cAL5YOBw|x+YG9oWBY-{JAfDGa&q6)wYs;&bU`xu$g6EbbU}6Cy-tosm_~luy98Z-B6UURK3ypK^oP%u}f#3#v&B7 za(wpj^r=lmK`nG$co$chMq*gEG5VgHfSW(gH1rjqHe{OPJZZVfgy$TzryMzP*$4Y< z$F#L`whG+xoF2oC)3^0yuv{^kXOy{%&gMrsufsKBf}O5a`FfRb3xEXSOaDZ|#PF+> zD%ymsT4zp*396dD;Mvkd-D3UD^3DYMDD?%moqe>!!jI8WhB&{yDD;2YB0AmbWib6i zU&%}6U8;UNddrmUYNBL=ikE5nb6m1N$o#Z7{k30}NII#*Qn>#Eec2?zzK@ZaJcw^_ zpW5_D-H=c0pS~xg9!8Nyr|5Ln_-I|Ox8N~s1PhHqv+hMwb{;G%;8~9)Ymkl$=W+V> z!(Sc1t|$iUkKrs>=X;-<4gB~v#iUr6m7_`Z!0B@BLz4k7>j~eOM6S9ie$5ANkr`@F zn=*Xrt|kY~bBm9}6?Mc@q-=9IaQ!n%XPZ|2jG|roR@XFC-w9a+`E$umwU2J zuCrpZsjRPp4U=?=3MTh-k+*x2#M(I31t#AH58LNes%-C}w_6QTM@W!dr8DBH?`2NI zdfyH^A7}j@{>(8}QozlMgS#)1z90Z@#Y5u{GwoF=od&Q=t6UwrNxe8jVQ z5ZXZzd%Kg$(@Tt#G8Fy+k|3H{kKCUnZNN2I@Y-(dk{`hi5xnQqWN7B%uNUL9#Hcjg z8>Ka%6Md@c$;%B<^g-w_e#fYb+^jPYb|339%(u*%7|lG#AW;5OwvBB$uqB=UY9gScv9BZ|t=}9o{ zZg9nGs6owi8dYf*8NfRd2@_W&03I>5ZjD+?Z&eMs>ieWt8j-9hf+4i@a@0=pZ1MjA D`_>4m literal 0 HcmV?d00001 diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/1/3/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/0/1/3/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..316c6bc074aa0e087a02950f6ed7392b9169c658 GIT binary patch literal 67048 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

+OK~MxPnTem{+pSbZ}l$l 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

TV*ksYy=fdk+2%m6I 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%0A<^dm?drl!89`EevTe*t8JOgK0kWK|iAg*hpP5 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/0/1/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/0/1/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..9a77127fe1a40c175291050ba1cd6331a73043fe GIT binary patch literal 67048 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

G73(18Kb?Lk@^I_ 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 P@SyCKpJxZ1!+QS*j}8g9 literal 0 HcmV?d00001 diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/0/2/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/0/2/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..163fa5d956f216f5437c63b8e109ce85249a84cd GIT binary patch literal 67048 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ð2b5GZJ}%ZIZtI&hGhFdnUEC_Jb(9f#>QaKLdt9T?f^ zMz=rk$u(tSGza@L+8^(icZuL)uQ}Os+n6uL=C!v6TKXsFrM?Z-0B2|Tk9rk0Y4GbCGXJE z{=?Im6Jan>SXp06UFt+lBJ8psGT}Iwsgyggu9I|<383TMD2{RAB|Y$!ucP!g|LY<) z^J;l7LYywNw)OHqm%=*-!d@x^(7szTD>eZwZ;4+Y#u1CtLY!=-l0`)OFGLQvrjx~B z9(pfWD+Y6av-Oi-2?Z&@UJr3`onz-`v(wSID`l380#p5DO>B*y%uj3w{m1Sac<8C? zM)X#(qu~CIfyyqYKN=jgh%<~8+(dtfOXylLDHg_jdgD=6W+L4wzaPXIxTJjAO8<-B zp4suZz`4?*?!mQCyI7DU|yNFz9a}@7#2z%IrXV&efzs&s$IAJ;fi2#>8I8 z`I=U++M0CZAWq$7VU}Pt`Id*Cv;urn8GW9cHkgU(L!7)si3u>{u?barGcGo_il8

=wfd<*}0#nTFy#y8ko~e zxykVhnh+P;c-~2t1P^{0Zth2%-D>Q$fZe{)ahK3hQ<90_VAm(%0gqi)mr(nHQJY(G z7(;#((>&Ze_?DT!^JH>gw3f1395?s}vrA#nt$T2ir6JP*4bb;Zancu3*6tc89L7_LcsX6xAxct>CA=qqoFluI({@UK#YV6n^>2dZI@EB;Ndb|%optqoN1 z|3TS$O735EW_A4EOj^EUjh4f5qoIpGBzM{pyVIGbiGja)9epG<-ckefhmadelcAXQ zbq{Q>pN{@K&}J|(b`=fd5S6tK6CpWm2dH2cF5M{j@_5!XDs?ttP(D1*6tie={Q8`^bbeU6@G0G5dw9>AE-c!{Ov@4|iCXd% zUuQX(t%}{(rqq@+f#Rrdo4`qT!OtZvEed{S4Fwbbf#RQ9YkCWr^?%D79YH64%qm<( zXE=c-zJO|d%(V?9pbC$sn{31trEY36*k~7gkV?!_&E!tdXQ(B?WN}6IIVW=tUG*F% z0ta*J=3MT?n9CeXF{;i=^0^+}cRd=?E+Y3cC;ui|??4Va0+ZbESG#UW1-l7L*bYB` z0hS$#%A1Vn54rcU7-yYwg0%~x+n)tbB>;Wbgjr@qaU4oKZn6hNU0Z*FUkN16O<2sw zOkl+}`1R18A8TQMxs^s4kLS*4S*BHH_+C(4m(PFi-(dEwx&N6p3o?a)J2XE6~2*`2pz*M1D~i9z32cYVcuXfc^HG~ zuQ^2e6I76DGKs!gkX^n&ZY_e3-DiIMDvWg|D((t;{93sEH{!RvH=nz-+A^n-02OsQ z^)5QR=^Zx_KDJ?AOAzpVde$x!ld2$w8qA5+Luur$O|V)8`oLaL?MIiGQ-(`W7AK=f zMC1%cBRDp^uJ)@p(OmhncZ>S$$8X8A|8lB z#j9<%wTzz)JXVkD(vsS`*PhFSKrj13Z&}APoX0ts>neg9>T-`nA&t$%<~;WWb>ok| zMDg!oNvPN-n58{uE^x{E1hPly3YUM$3LdeDCmi=QdNS)C-*{Z-W3lYGhv?S#bv+Ix84}JFxInvaknT#4+3R9=z>&yc=)zL3_I(kn9Ui zvKW#6fp2dJ&S>lM1&Y8`M!;&v5anfIQ15Y8in+3Zjc8mSnEu_3CRxzUMWap#;;RoA z{o(h~O-v*Pp`waw3ctVOHv^eZ^P@RtS-7=xfd7YGO+vJ8avSimFSwdECt_E3DUg#X ztn^HGwL~R39LUF$Tx0IgV|HXAQ-JSXBkSb{TPZr?cd}(N9JZE=Ya`t)c+fmffZt~Q z9|l4(Czb}i&PJdkZiR~km@z6Q#+_eDy_4QZZ;!U|E)#{7!O$aN&V|X;7q}{| zm>K^D`dN!gbWr=aW!^_k=Rf1dvpRB)X@to5?=5ky4xj;ab>`wQH87U7$cC=55vO$r zv!Kn;Ax{$6qzFdm%jur@E&K*9wcp;Y3S{<+qQ9CuhiAGD z)iZ)Vr9!U*r**+~Xr-CJAw%dRd+~gx;4e;eRnh2wv2R1E|0{i_T-*|Lq5PauY^41I zH3Ok+J*T5Nqrr|>q*s1(yQ$H^V4i~9meCcR@D(0pVP+YhdY}2Gv}n6marrNyB^HMT zT%-rB<84wgQ?e1=BQ0lNexUYoRsh{EG83HziK+CQYKz2Ks`i{53U~v(dpO^TxwqjX z(N>V%-vZjc!477l*VK2b{T56Vg+>oyh6ScPnhKkg|A(B*?-kd$8XV)V3h1b#HA1ubfPjMBxs?gShnD zEx!GSdp?8idR+Ion14^>cI3{gx_(*whxaxYhW-&fpopvMlA;d3M>7cz8cOA^1hUd$ z!-DxUSsA~xf7!)@DMe;BcC;_d4KJs%`MQF06)#)|e}sS3z49AHsO(zXOnO)j7Yfz! z7kTj&eQ7sJ{y7lIEe&S>R^lTRXWG4(n_&Z)488<*Iuj`1cd?b=xagd5j18WjNyN2c z?&&K?D?}%41==~zByJFYy@4NIgu9&f!i67$?IVKR)`Lv)bMh=5{>KnL;Rne42ls&P z00UP>UkXu9DzS<)iRJ3vOBC+roaqWjb{$65?8=Au@a~8wml$!tJu&$HyiK&Ym*%3s{+YwxXa4v&QU?}>=_zMKI%{}YU5FB zj7o4B$Lj<-N=j|*HZY+Y9_=kNdev-{le*}2(dfXT(S2^Z6#C5G`yH$!OzSj!{|j}q z5I6kYV!cLsn_0=k=rSG%Ya^ama&3p78U@7KzJ?VcQk7R*0lx-*-U)ve+Tbz!?tgL% z+&ONDnJDM{%Eab-e1f0!ls2dxt1U@{xglet`Yv0^eqQ}32 zp_~Fga(^0iu@#eY_q@Z*`t0J4D%1JiEO66f*7qJgFB=GJHMO!XH`L`pQCq@1?GDai zgt)37V35(=AN-kkOv~S->epvNZY@e`I;JdQFsGHyeFWRxWfJKf`9BAbsvz23CJO^= z^UyfXYFNC;nzjSgZHlIHNzmC&`#b&r=%c4lhMTxVfdZ`NOIN~ub1VFEwgU8d%eC?Y zeoX(99SW)#p+}%~AgzDZI=QR9xiWl1GOdBv(#;(J`RteF)Zk=fM?rL-2%NYs;Lz)A z5ECScnP@p^8_^s3OA>1DKv3~i_N0&AbxC!Ii^M$jN#-+qa<9j76g)V9g@L&&z;6u0 zl&tA8mqRL{NpotB-w%&RH<^>EKUn)9%Sl|N!@rJKmv zzN4{zL5&Rynl7catp-S~CMO3RtN0TpvXHKMlNq^*aLrZJ>OxFH)P{BKU><0ywF7ld zr1A{6$m~HFD%~90;kYLW<#Hi7X&0L5M*4ns*PpvYKcXa$;?zbO^uNjUjgp+!N$eN1 zG5!R1Jdnxv{k-`8yZGL&K^Oh8K{*3S{0x3FcidV8rWGpC}| zdluQR!hJ&X@j-$)ZLx~;3$N&DUpQ}*m2)$REDxt{lFDy9={=~iXVA>&qpTF;E}*4e z$UUC;K|?E z%aGN>9dh9LNK78jq@NEX)(dc#QEynsR{Z2Qu;e%B5-oMDKTGeqV7!xV)|?vn&8GT; zIb9m$-l9DX0Oe(Kv#q`B5tQFm_1|&2JgaSEM*DT(3ReM71;@toJK`KCC_1)+*2gCo52!}!JBLn?6G;k{=o`Z9D=dz4PArsy6zl6Q2M zjV3j9OEXZfu@2~-`m7oO)4JBI)s@gaKC2%1%-}U|K#>zpjN}@+dmQ!4N+3 zFx+f}3P6DvE1v5oWWuy~m`-t4#)H5#2&)ZfBoLNk1~;K7933-3@V+EP!ZJ8?|0Az< z;@=MBFK?+hsU1W*9O9L!5mw07c%B~d9Pf)*nVFu!da#lCoQ6uOr{e|N9WFSw!$Rf& zUCcv)Uo1|_W^}!c1ChO?5>5eDyRO^9Dffr1{+F9p8dO^Z|7j@MaRxr&XCUU4{N5=T z_~+m{KarhEH#=D`HJNFS`dht%OYnhfi$-HG#E9MMyKJvVsQjGJmEf+ka<{rD3aUx! zpxSQ2baxePHRHrJGdr!Bs;k+ptH|?UtA^^ADkXPGmwE@jT}+04jMK1=xQJF=hDe_i zcDyMJ(^KN$T5{kR)m%s5da6ZrJ3_gsyNl^_{P_@ipU251@J|!zEZ8pFGc)WX(`vVn z)faO{vJp+T!mlVbAt^hNo!>B9?;*y)~wZf1g28@)l!;%p|EwdBtY@;qnwHmA>4^<-A1U`Nub^&}!7Q6ZB=5eH+RR-V2GiX^^?|Fu z%S}i3h5@ZaXVm~Y**j6=x2JNQ3K9;dHvi6!k+;&Rr{TPvMV{{uPuP}odX33+JLw=u zA=gtAykM5oO?dGjI347pC znMK~(BLkVN(*UKaIefwoIaJkSa?xwla(|VNnzaDfJu6>-m3ww12|p0~Udk4z+w3t? zE;SOoUY1%OpQVX0A&Q0HJ2G=4~d{7VXa>2#@x6!+?4q!DoiYahbhL%+9lp{&J*D}M{j zJcr#>bUS&5mq89Eaq~9D*HDZZg-e}XU^Eiw>1ak)KZ_q~JClf(!#R)Pdrc5q8;9%=@^8wUqlj*4LzJt0kr>|^OVPJt-@i`s8B$nXIg_A_G1Dv)0s6>VGMUvjWx zby-Z+RP%H%^;`d|=b0&{Bp5fG8f%)qt{SVQ{vb?F9=wi5*9;+F!cO}eAyT0{M zpSH$|TBaHHpA3ry-+uCR6vg`$$32j!~1}{G?&;n8_bss2K+j@SY_0ZPN=gIs&NMFY7l*P&kdqDNIBM}H)C2jix0h#z%`sECF-4i&!L|J3KR z+@yQd!(+f<(@}UQar--<6Z{1e_y%sb6SpD?7BE5NR4onF6v$~l9W*uZkrfaT^x&7r zUlPHyOb3=|NOWI_uT+9_s`2Z2@SOaRpXD8JMN0L8DWm(t-|tIjD$apI2W5ecq@KVWxIcQP z5^5aN?i<+~U{ab9Df(-d9;+Vc0y@}^cYo6HW(qE{1Jo!j^bOel&1y4lnmADAP1TLP zXx_Yw6y(ZA=vguJuS}#vJiXc_=E+8OV{-Xn>6SNiC|yTsI6q&Aa5*_i@XXxgEpQGi zWPOxwe_S3{*hI4tPu>CM#h;_uZFkj!yJM!I>hw0@~HvLV(zA==&vB_s^leG zHPsC@ldaWC^&9`tNA-bNvQ70jLz@_AB}a#Q!+~Sw!BRX#kLGRU5}?iYN?i)A$l(UhC7_SHtK->M?0-T+Do0(tE>ek zy;`chWpZ6#zEri;ev_P((_NRB z*Qu&f>F;JRr*XB)!v28(y%cwhC2#&d{N;q+jg!m&Jr8@gUDL&N&c z{n~+N@h_O|XPo_kYO(&1qyXc2Dv!IalbQ;z5u(xCct; z2y+%Dhcju386-@$*-o7`0A$GK6WnG+n7G|R)#3itL{&U}74|E!191z(^0l_M6eP^5AONO4n+B z_6^l=uEecA2t9l&@9a5_%Y2;5=XmIAILBC%)jw4JKVcIGgT6QGnshxqWV%Et)QSOM zq>L(q&MPx`TA1(Zy6QoU`2a4T%FkH~pMQJPj$F4C-n_8Rg)8W&K5pjg8tQ_1hQ`|1 zdMmbC1ywx$pK#R<3{?x?&O~y`EWFUE=)~P=I>QcpLyx$jBV;h1)L!bPV!9Wf=QuY_ z%F!rQQAE@kWSACYrtcub19+b1<7NIODpMid!U<3ur`iiSAgRxVimC=NcMDwl6*9+n z-e=M#zwC}f_`q!ZJ8PUtzM{V!=h2gf^4)ez2Taf+c=h_Sru^WnrM}9p@B^FJh0d2`ERJ(_C9yw1BvJzER zy@k{IU92>bXod?+v}~s@nE)NmT+~i#sJW+h;`(V~KBz9l+JE(JRRZO32=}$FSY%f7 zna1g>Ja=|OiAJzKALS?R?=vP>ZA5{408`(Yy$mg6CBAY2cWyVodzJd=Bu@Bfe*WV) zdb)G!SCe7O!rIp%PJaUtZNR${=6DMh4u)wOLM9vrc0GbpHH-cmBXi(tD}iFqBoEHy z1+q^Bv&}|}1jlG%YXb9eYT_-NfQs%%ErEj;G_{l7&b;`e-l%g5?;gxodsN|_MCw~) zpD_OB(dw-31$w(eHq1_qKSrlketNUcruyp3YKK)-x29^(q~7T4)E$jve%(h4)1LU5 z7f!Xh-lNOOZTh0AtIwD_u!XV4;VP(F*&9s(tGH>dx2oZ4iYkbYW`JyK2N6lms0ZqZ zWXc3cYBCsdKmMCShN&;`P6xpElVNFJ!!VblstUtpS^@TdGt68MD%2z3+l=s3B~U?Z zVyT8h$@ITzvo6tr3TZny_XNI}XrlO7d??psfa41O(rBLTNS@JPG-F@90XsxeWq$+y z>lQUcd7k-x90{$dJE!AbO#n6Y;T(2D-T4LnEyMKZ*LW6_F`woEjPF+>`ZyFUZ}gia z1$7C2u+(xs6=8_AS4`A_avc7)(@dVM%S6ii@(uX^tn3FCDy^2osy;D8WgzwB2sD)S z>I}H4i!Ll5>cx76`ew$fEY=turl*pVx~dXJC?7pby^?3l8LOpr)QUG5&}KJ~&t6hB zUof4lM)+L^fpRNa{%D8B6$)FNjjnHMbCkj^@-O)eO*I^jD3NZ?E#S;M@;9~TNO-q2 z=t14^*cPCQEllKcs7A!JVoVjCO>bHRe7nDl=UKG|#TS+vogbASs4D_(J_9UkEYBj0 zeFWtk??A*2iL^G=#W1>e+fyU$MQQnl0(KPcEI|c;$2L*T<%8W1qzi5t*scr6xwhjP zSfVX8S{v|bJ9zR#c(?_Te+>**TM$rX`14LYFAH^TJ-p~ElU`?KLSJ%u!!$HIbT)ce z0!_3@QcV_tqK1%%2Fmy7G-t(U?Q4$00eaz>YNiM2f@G%)M9+JwuVt%3vX60?0roC; zFVobjVO_QT)L*8ISz(Hqce<{AO(pw79Me7E6TG#@s!LqE0Y>sAcT2KPT{x2bFr3q= z@kdd8b)nWx>K*nXDtsh@o)=M6SYJU|-%!dAQm^A{;0?H(C$t-^kW5zANz;iH2gD338i0dstDX&(TdpVRP3DwNuj;BH>bEIx z6;roWZT$ex-#S+wbJ0w7ZT56Bxu|t3ySrOu^hUExg;^^NJGZS=8jqi5&lU`L6a4N~ z!K!!pJ_9&iHBb-Z=?Xlivg<>jrbqZ-5~&oQ;fqbrl>a|ej~U^{N5YHtqn3yJR4vKb zW5I^s)Ep76y@?nrn9~sn%k%|D>jFA_B@rRov5+33LDb8K=m!`j3WN5llS|wn-Z)&D zMbK31lapTHf@?)(&=jou4-@B}qtvz|kA0)(?+<8T4cM$V@1X~EOlO$x>M%rxs%bKs z>PC3eL(aQ8guIamt9?QxDN|`xW-}IFNim!TM~R3p)pR-0BvWE3E;po~DzXU+=XB*sax8b<^5yPMbYC zg}SHfTa~CLauTN&bDMXn#oWu$RP@Q<)+XZd+(aMMVG#ENa6nHnQN<7=(+OA@(Dg#5 zNzQU+#HIfcE+mYM@D)aH8$Hs|bTTX_b1jA~bf7o>i#k1A%qJE%V24%*$0PD}0ul2T zF2T|4w20u@HN=ZJ9j#{xI2J9*@tkVpI+12E-+L^lI6rQzFYpcQG7x3y+{i&5%O~5x z@|1;H%?q~K3U84|90O4=cgE>Epwh-NM7>7w84sTPhUU3n-Ba6jM$Mu_n5$>%u$|iS za2`vl8oIQ;18!(zoc0v!pdPQ^>Oecja;oDvG5&Se(I>3x)>7AZS5|YuZfv)*3%FOg zKX@|P6RpYi4c94?U;>QRzpduxrX6ioNr$ENf{&JVa)&Y(E02eJFArt+BnDQ76AyOE88 zcs85GOviHOjC|*G*5$d@M|m!SA7U2j_b+ju&iAUKDCesijDgKp%>_vnMMJ;GjIW$1 z4DpU*)SH5nof}Q{7&XX#^qxKF4T;W2>aiTf+dKf{wMngWY;rH3w;j_(WomY_SgKLy$w>qWA*bntsyZ{dChpV%mV{HX- zR#%^ifF0>X`zdbApRmo9)E9LZ)pwuhBOP!Q!^rFTK~ELnmWy-m5@G*h&pE%)FXrAng<<_hrTh&y zV`Vc-ZUhwt^W+lomsQcDh}B>C2@a6GyMb3N{Y+iq#D>AP^t6uasrrGH)xK=CF|)0$ z>JCw$0&Z(fPxMZ!nR%$*c+$F-xHh}1xI1`?yXyMP^V;n<+ut4VEU0bJyO8jJx7KCv z%3i&!{;sBSwpGa#GDbJFlYzX_s&4cQJRnP7#iu@!$}tnpin6+#Sgg{ZSNfv&Wc}Z) z!YA?_jBX^e7kl6+t4il`ZCM2@zLv9C4uvu~yx(>`6~$p3_rBQwW?GFR(>&q{UuLq{ zckq-K+@Zt)lNF7oEI2sP8H@AmFA%{zTnewKi4ws2c{!IY~c&W+teTg%pm<+ua zeXpQ1GoSGTHP;gvLx%LC7U@98-5+YWVpL7D^b7Qnm8P<6jl=Q^GjS}rNH13H%_%wE zG*gZAL0y0j@XorVso-|P`5(8&Sb^$?+OO+af4e4|JeH+bSS55V>mTci9^*2ePu{=1 zoxT%&uLlGNy255hea)~dL!qeV{{DUwyh{1Bu@_h)OgS@3Uv*74XY7*tkD07T!(BZB zll8?dytPi!nrXu zNGdf~<19jV&q{>|D~Q&3ROY3&U4h540v(YXQJ5>U&*mTMnHc$+r{ha^O+2Ui5ia00 zbcYQ=(>iW zO0Q%XYTRnh{$_lA716E^;(j@&zUdxD>No178A1Q{MDxSSU_ZBqyL#$ZW|(`3#S|m` z+FESp8gFZoDQg$?K5jkoO6{uR-N^I9tGn;(pbY^j!p~(olPxUvM|Anfwh;~du6UpG z+U5zigVg}5FK7Oy*=NV<4XVA>8h3mla`tAP<2Z158K&`sGK;x1owIddU6!Gr%#{`C zR_}xElMT<$BUG&Z@G=eYZ}e~u)tx}%IEna~hKfK=_-CD)K1QdQivNA7v4y{5A65P| zvUYBi*UQxL8HvZeU{8ZkO^#8!F2XNZ34Fd$UL>{`0t*Zj2Vq$YQOU=mS0_0JZaFSF z-3ktXh%uYD=%)sv@9$7XUS!{Y(f$juXoF~?v>Z)z+v-0`m@v7%J$iI_( z<3c`0IpUsX_s&X ze41(G9iCBf=_SkQN&KWw@HyDj^%J?n&B*t=MHl$nHLyxE=^H;zcb^-bHKz(fFP-B| z$64>ma~vWBOu-pvVVP7ZG{b@Uh5xRKgJ}Tn`FFgNgYqbmYPT7Ps{M%y?-G0zlSO%J zSE;`Xn!4&A*uUePhYg^Fhw7(vnHhSsS!!Zs4Y2zFv(wYt)!BaU%50sozq%K?+F0+* z6Vu=8ttW-+jr*=^xu=u6jdynUSuf#<2w3gcC(W@8YvcbESzf$rp{99;XY7~uXJE#l zy*_olYPfQlZgx?-m%E6&t9!Qf4M$ILGtM~ZMlHeTJxUZj@9fPSpLlp~4>-yx&zlAE zC|}o9)WD&URZYb;CdhF9c-aQ&S8BRGg|Zlodo>YNJdd*(I?D;CkcH?BJ_oPYK;&l* zXb1K*u7&IVMsH^q$7lK%*1|l+;vZ^CPV0p;q9yNQ4f89;Q?Y%31x(sxl+?FBn@C+; zMl+cr5>{d|vsUg=;~k*V?+2&uP#S-I7uih~GuKorzQa$M4o_cM>1EY7r*OJV#M@d0 zZE6FNVt_tr+RH6+nQhzGta`2*?rHA2_8xa`_XF1}>tD}p?;W0K&p5BYJS)6&djI3z z;vVEL1DXU3@UIo}SK5M^FXi1=aZ>G4<@`(T$<`$Ony|>wgrHBptvtOw8?A4yC)PEX z@V;P;9lDg9V{)lxvZ;wuE^bRw7k4AA;0z1kj7<(pS5Uvlr)}tB-mWssvalkb=)FFy z*NLWRWsh}1s=b@)J2k>C+EshQ3lsg$n3uGLv!=Rc+gjHXK!qfL3Og`~WH$SS0+~k89{0&ya_jK= zF2zYSjjGg8)y_j@4T9zF4Yoh*c!}>~AsbrPqjdg@FC><($FiW-*{Ui?Fuw|cIXQ&N zF@z~pONdlu(OcrwD=V}1rCvNro;xg#tBY#Ab%9Froh!RN(QBD!W12|+ogo!{4td}9 z3HI9f7D?B5n zd_nBjlY=&%g{ky#dA1-`3y7AC1;8POny15hHwH= zh+(v*;=^9X6U$6paF6GD8w5}qMgYH>PKNTHL&l&w)rFsVuJ2QaZA7IV4b#zsURom` z;dR4J1h)JE7u|uqZ+V!y<6?rt33%7>^z-<@lfS2*?r+fi1042`&_t4^4IQEXw~-8G zie+ZbbTquw2vrETSbEjggfSzW*$&R@D4Yjn50t4v_@ov3ab?-YEL9OqKOQEZ>D=-j zd`Tvztqj!bRYUu?p5h9(OS_C;a=#P-@j-uwjSpTPGAvDZuM25ZVA|kbX$Pn6lks7k zPX@2_kHRLTTbjOSWK`xI=~`y_o&9&Q4MpNh9VmY*;b5N4adk4Z2u>Ba+CPVPjJt`; zV@a=a?p5ZbscK4_Hzub%Xq7bca4HH|y;OLDewgHPH5^2|-h{>*NZ)NO81*mYt)%Xa zbNF-m;G$LHv)Z5?{PZiy3~gX$i^6!N#@m!f9mKoSKoo|*_(!s}R{W6Pz*NPVy73y8 z&>P;L|Ko<{#$R>?MQjuv^f;Wp!-)WsbQV0u-Q;q8SH4jbWGgaYl=F)!EXU*9yM*WO zC36(Q)h)P{`NWd7;IxfQ;u=OJ=z*hOi0?d~c&mGgmzKkv!R0#&HMx=8V!qjZsaJQ| ztKHHkMR2RY?IE7%oZ;)Df21oOIVY@Z`YajeX8E1@PW*;Et@9Soy)f_iT;p?|$vQ3i zL6(%6wq|;fvsA8w@%8dIEpei7;oME4vZeEnoD$+2u-84o!>QDY zSjBa;DsS6zJH4^dwp~T`8g?+Bd;Q-i) zHeDAMl6@UA2b%tOuy6}HQ}+=?f6Dr(x2NGEtBWYq!rrJ_Yw_b2MsGhWbE&yj5!^xP zm^4v_$tOu%Rvw)khQ6(ChjZ^=6C@Vs1$fks>vh!AYjheT?AfjeYqxv0>zdE-U{Bbq z=*HR4<*ku5dHPi8|3vv^UQwWYf-F6+NR^_e%l53Zs!UYLM}^ZCt&ur%j`eX>GyaqD zQkJ2s>^E(^;L)^kNP|Irj(m5Rc2hR^W$_oPn#OZ|CflcW;4}c@yL3 z#h)#5q3Xj{zMY0OIohgZ)p?B)>K3YTsq)Q2&9nB(nl@rZu0;wd>d=OfI=s7cfz-hV-kZkj?Z8c)hFE6xips zc*16&3$rVR>Z>ECH%PSu7p%uGTT5+F=|Hr5L~p&2+P0o^87j+bPL)IK7iDoO#5sP` zABPW-+~)&UYKST_7w-NyTe`P0<@h0=08S7(2VL1eTH4XZ)IbvraTMU zj>Jb}w0jVqZ(;D|Iyg&mxm5tZA98PxRER zV@nO#((OQp%MCU*@-01}s9)wnnNp@Jls<2!?-`C~S`l+4orn#Lc$R5y*uap8&>Eci z>%kcVoA^BT9^jtkR%*C)Oy$L8bw|HrNSI$D6k)P!| zj^LFb@pGtAHDIs%noj8cRl)4j(4IO`o2C-AP%Jaz5RD@fU6RXiA^jrGHe>?aPP!i= z&;!aa+cVxdNqrFOL@Dm?S>=U_kpor4pS*n&9jGqd%`1tFW#Ld0ReGMDAMTYgFpaa& zWkN*(CGk7cd#}TB&lW>F`vL3wR#X$~$hf!lb^TIzl>z#NvUMwdvL||QU`%na!o{wk+R&)3nkHiq8M`cjtaRnmua# zyz28>r;BIJ^e3)!M3aoIBdqY7nd}UM(>fwDhKGh$2}=w*7~C^7HuOxOZ(xFVIo}uV zC$4TTe{(<$;W-{Oi&Y;Oh=n=ddR-*ZsH#3S>cLxZwdV# z(<<|)oR@PKDHd1qRFx9d>lfKxv2lI(Ut?yD*sycky+y6Zg|~XsG;gDJRc{sQ6@N6t z=(Lehi5Z7w{4YFRnp>eN&Ev3>X^%#V40kg9N*@%NI^=Fp#WZPr#{1;+I%Ue5_4r?2 z>bWSAPw<^LG>7Pcokhp|C0&vVXXO7nyee>d#?$vV1P?|K(?Qyj+cS{cJaD0YApFC4 z>jt9w9TL$v0b=C|xcRywj=rVJFmijvH+>0*@)$9mO*mUc8pj!`of~*1{pEc+EGF`V zjxu$-J|4sbDzY7PgJ{m|PonQ0=Ur7EpU^VgmX~o&48m{mKt6?~IfhdzH&a!5Gc~6Z zC%AzeZIytbK7)SMkAAWTx{xv`A1SF3d)jxcj;5FhnUOujJ?1=Ckp=(ATn;*jAwEQkd5+UeU*3#DzY=EbIbE-v$@_8mG4F!$S8(#1 z;QUP5b+;Oq+(#J;_p+J3>Ysw1L$q=qCvJT@I8$*$a-+3%!kym){pX}v2dYlw&;5bv z%V!-?RZy71@mQtM7nv9vBahm5?T;Xz?>_efI)#0RyAhK!+rw;!axN}Dqe`mEZAzA{ z^twbqgC4E#_4(cRQTuW&yHsmbCAi#&l67)t$h$GaopkeJ&P2`&%Njh$|C@ga-yC6u z!~3Mmn`1}LEP0a0cFEW%qD@4rpvgW3+#dIHs(3FQsG`++@zrz&OLrkh71fExB9oL* z&1Fm6F-OQNw?JCEc=N+WcPdIB`5HgwU3`CosXQ-{r{0sH^TBv_0!{jnuLpyvs=?Q! zByVh0U5Jhaae5_ZHpWz(K;!8SEsRFCTr~b4wyI9OT2iKCs~JvARJhABQI)}25J|^g zg3bn;ct<9R-8eMv<2xQkL>LVYs|O0(kE5f#oI;la(+{X<&%w#1HocieSJg_co|x8Z zzkSVR@!>zb#Q&-K8L5ohD3X51E^DPO6Cc@_VubSeMJgz{xK)_L79 zp<%;Hjm!9yizpFQIWXct_AaZQ*@4$#OiGEXkUj&|y%#kf)uDrQE<;|Ko zdq&^zy@CE|PWgQGq_;EciOj6bq5cLpUE%yBDcDcphik|Xp5#KjQPXjVoFUURCHE9o zfAElBQ8+!xPvu2>e6jJI?VogcTjZoKvISFKimR)fcz-zl!&I9W)lj-9^TDFb5=WV^ zmL1ngAon;uPV@J4zF+2UccsT98GWkj@e*lxmQPF}O4?JG6A#BkDyq@ohnqOGR^a#E zC6lHdWaW2Ph%lb@G90o#e048su&QtvbMyuDgLS2|Tx}nT;l|XMn4$ zyPfNe*YJS(X?}!X3+)~LB2)MH_4zl{>|Mq#yuVcOyweNrNO)DWUxDQLdKdUu;!ff0 z#al-giOLuESB6cIgMwxSHT2)&Q^R+Ye{k54C};G)@s)FC%04y58B;dAR%o%{7_Z8% zou-R!%=E1FAfKV?2RWdkD6VUR2DiZmCW784bAl!?4Yr$@uAJyhS^l@P=01#b3;CWH zz{V{m+#F)M-*<3BRoK>-OzxNuPqmpE{gV8pO5jEr>#WK=QI~Ksg(Ms#v51KP>(nbW z-RW{C&WYZ15!$f3iA0OnqCL*zw^S4N%}U#lUSltJ$V8hG(-(mRpkU6Y?+x?cTD}z|Dk%OQ2jjTT#c)7-U-?aMzmf7QG*vgD3ml%-{s@i}tGcFwRr%a^Q^AbbFni_%+PpX zWnnRd%$tlEl>=Z)#?f!vm|nyNoJt|k%J9POz}vb+*Bs%za;2ka8+u|3^-V~utnbmy{vdH!~-b$#?{6qwa#kl&f$vLU_G zUyJ^dcUJziIacNLjVqX8e7asyDI$JFq==j!mLXm3paa2ve&NAIgX|E8e?y<0?mE8G zoyx0jJC$Z}rY#bv4sbcyi$0I7`kC)8R>#J_x=mZoyy7 zac+;Bw6N*`clp)KQmN#4%c+Cub(&5mM`>8pJIY7Q)Fru{|1mi=71^mi2y7)<(*roC zQm|RSso(qSmGFmq(ZJWKhOklopsWi2e_zqNk|x*v1D?1|E!z<`^$`l=6}5nvG7WB_ zAB^>Nc$d76#?COM<$ail8N~Z}xLPK{?e)hC=Z(+mod}1AOr)Ov3_G|=J8}Q7QRPg8 zRUAgHf?1{JdOo=pxF72Jb~AZ^YemjbIA4GH-+!az*QlO(v0-);Zxc5+m5#u(MNcn$oHST zg${m?{!2DsQ2pJ|YnkY=SG^}6Rl}9o7F{SgI|Sd$Q0=Ymq6#l&0*-|z={9P9MV%e) zyC)1W``N^5)eH6cy^2$_=;k;oOR>MCIi9BjYOt!N>ci=Gfvq}Ek9%(ZS;D*MNY3d3 zck7VdaDAn~`}+_jD``(PyT9m3a5E$Gsai?JT7*A4liw}PJ1&94W0uOU+RIGxEp_c= z)QOT}n_2`j)ss(M%c@J~-W;_`@3x!kDV}`x6IYm-U>C7Bxh7am++*yQ=BPWb_iL{% zevkapdgb))nC4W#=QQX1m0xL}HGX}4&UpL#U-0f|t#%FaBzmTKrnujmL~Ev*YDJs1 z?ogwwcit^MC47eZCipD$U*j3?TItzgwX?6mi!3wq(IUs-R$IdpxkxYaP9{-Ib)Mve z?$zZutM#c{O2{AN*?3_o2dduzs-!e<)|yPyNaR9qs)Lu}5SeWP?$mO!GSBrK&iteD zfl9yy+Y}D9Ja;^j>L&pvyCJB3H_vJhJ^@RGk?)!50jE-c2wII?^v3ZWU1t-MLU+(> z(2K}W1%3P#+J8>m3X9-R&#Th16xc-LzkEP{RRg-fR*DQnbstgJq*B|Nkj8vCHHS{A zf%>?P@ba}*(?$Ka&sld5z1dyHZmmDrb<9uCZg+9-<6bjeX9E^`4*J@D)4a8J`!sPr z-91BGbv;wDTv=VEOb;Dy?X#O%EzDqhi2cd4(&cZT_FmxH?RDDZ zweGl>Rv^7iYW0l1wT#Sp8Uoho#xs>i><33Q{NP0vtoOy?u|Up zGw@H1MN<_Fmbwc2?;rz5hka@zrR zAzOGRnP2vH&kA>I_gb%$UbWl}J&V1{xNdqaw_Dnctu6Yf_0`H`&YJPoKPplEa78k~ zuDp7x?zj$G6YNlTBUehVBKC6E2$R~XWChtTQMR!3P) z#+_#x16XrC>ZcIF{Okdo&)VFI9*+I^)DD2JI>TZ=q|RdFo_wqQVaYepcXAPC$M7_Z z%O_NOm*fR_-s8B|#^R;9hnKrO{C5iw!8=ujsGUsu$x}FMGT^;D4zIn7=Q)B}>py*6 z`nXc4ID4k6p?$+FvFBJdOi#Li+JrI6CPr^}$+=GCRt(*t|49RXr=ns%1UX$*uqFoK_lm|EYG2YqCBB&%mx= zD~2hG8^NMcO!@GIL8(D~=|Pd$2?w}TM#*)!uqE8*I;O@f;nuSS#&na#+3He|$#P?v z$Y(T@d1Vjv85Sg5Q~`@0=Ds%u$B!Vl_v21SfY@`PC{~nzT2- znE3*;V7I=@9cX#Aao4A#X8rQNdTT2^UdP~3a&a?~(Ipk4{_uIea+c3?t7hUFVB;z7 z?GE&G)TX!lmvPGu^x=*L%jRSg&~$Xo^>UKwh2zI<{$)}{fcd6BqXA~NhS(RZ_SPGF zvbO9fJDt@pN4{V7bW@}(`;AD=iK{8IA7jV*_{V__N6~{H{R=|^s%=kX0pi)^`w%R zrChM4bx~}W;hTC6r=1;+e7Srn3#pN~LdtVW+cW9#Z`q8Ate2gG@O`yozFc>3>mb#@ zOj0lPbW=)~HoKW&yIV(^3M#oSXsxk_n+W_nm+i-{I9H-4xox?}x*XO}ujTG_?lg82 zH5%tsC0AV;uMb)&JZ*8cW`0A`96%1p`Hv@Z3T~2mTa%^PYz<&Z!gtC{06xdCwlsbKu5gcd##*m)1IU+7#0h?H#(gy2?C|zw|tJ zDI#o?>%6&bEwL_uoNn6Ltx{UrhJJ!Lm0AbswQ`icZPuDZlU^QG`*cS$*rd|6Of${Q zAyl3DV5vkfYJdF%d0pJMgvqUu|apk<iso%Dlf28W=|5SR7;KnIce(B;kc)!(T6senK!$^1PRW9Aff=}i@#tJI(RF!6OVN_;_n}PF4@3T zNuG-8^pICj1{}JOPQ^~tYlTEOy^dMwP7H(dNvS$8wS6R8#!sQMWO6<=Evb3a3XkrO zKX|r@WxB!=d0GE3`E_44Q_nQXRW_YWU)G;ZNj1cLHXZDv);H^qd1ec6)C@Y=(4O@Y zGSDcT?6JhqC~G^BQ|m=?fSPZ*fWW)yjCfX)x^RDy#b>D~IT>fkJSOL4rZc*zWzfm1 zfEnV!TG>TkB4}n};%_-hrH2jfjNAMRNU<$5ZFi{ZxK)F6b^1S^P|N>?%e@vg!eu5| zE_J?vmuV?JsK>Gl4%aPoLhnF-`GEKI6UeFtXYn}G6Si{J3!v_Y!3Pu)Nm}fEs;95? z#M)HHQ+Vnh75l5GA9nGsU-0MlI&JEyJ>sh4huAKw$f+g@Tu_g$j#%``g&^bzyo(c5 zkgg=+s5Z)}093)$BCjgTSlO5*O*VblC(=f*HcfFqX2QQ( z#hunZV8`2it-t6^DQ-TPmU^CAr(Rp3C=6XyZL~e5e67aD$ZP21P3U6@)pOt)N8{t$ zC!eCqomJ1tomW&5U4+QQnsl{KeGnqwg>$s zC#@;?`FGRVTFRW&lbHpul1y~L-efH_S5$RX-)d_vqRa%UnW`vS@-Tf`#aP?X!`oXQ z=!El;-HeyYU;>#Q@qun_j~%YJh$!Zf)HZM7{y0r^Zwz2E**S3o%<_U7-(wEyf}*ZU zMg*fbjGW*gzaEqc_@9!d1aH6#J%TwZr^w0&czT=Ys2qt)FgLECYedbVIMMQui%QbX zx(tu>Y%*GHVrdF;|9GZcb!EOtTXI@7n@9h_1)PkTzhmS!X9l%I*FhKSz(mbhG}R46 z0XNfuPvc>EMfcD{-e=h)l!DV|I(5Vxbi#Z%05ZznoWy(1C1^5t)F3cxAC*UE7B{U_ z)=ZI~-k*tR;p2(h%~Vx$A4R(=x|YBN(OP{p%}p&`i5T3&6i~z9KUS%OObY5}8qj@F zl>W88W-rdZ#kh7qsJ%KP8#)BD2!Epvzt<_%MRQr5wffUV*V2^Kdx)zq;hhGls;WC| z&q9@w?w$5bQ41qy?1ro8=A59~pjV%v>%Rm1yDz7ryZEhxcbxRz0Z`Q~I8 zKRD@qB56N#qUnKussOBM6Hf9SreIvcH`$!|t$)#@{g8So8$W+i&n44n==9kJ`rX3R zk($mn@U};Y#1VLo3sFM^p_m-tJ^tcTG{W%_DSGP$oZY$1a(;miEuA<+w@)E4iph!j zs0Qkx2*fd2>=2P{ow%qy^oqRHIq8#~q_gu`dolsY;?I0x3Vt>77umg~X`tGvzfE}^ zM&zmmDw=N&sV(w5j)o(qqwJ{?y^$ndz1eJ%CLPa0w}?ohE<^Za5oIN%bQZK4rRG7w0Bsgzl$8%gY?oub`%Q zdfAULpFO*?kK-s#pO4^yGtRTz;#=Ylb5_fPwia-AedT)8m=nx_j>XaK4cqXAIIxdQ zHJ;B&rv;g6s!Hl#eyu0rVLggAR!_2<6;DxXoeGDTO~-E?flf|exUdol|p27&}4 zq=8Xd$1|$Rc`d}fwQ)ow&7Zl(cex6lSwM%I7qv`5*w1Lr^H1j*95B=1L2#bQyY#|d z<4J`G7UXDz>gARP(cH#vtyVEFwlVJw#lQnm%uW)7l_-XF*-2an@@wffL|M7_E z^aSr}8R^y`;$NM#Q7%?KBg)Mn;&$R|1ohu|m6a-&EjV};eyXP8vhJ=b=p(9>wZzrH zyhbx+ql|IuHPks1LBlVT)F_-ZhviYu+evoYmZQFFt4675CZnjv#LUug0-NwnACv48 zhZ`&)cQAj=SL9czs6WdP<37?2@dj^RX6H=xmfV~LA1}Ncxbkmm`zUb+ZY3ky+(!Bc zp5e_($<2=yuc#^m@ITd8v7En2Y_v^MQfE1Sqe#!86MG7i7^{L;4?BLt5WZ%XxP=Q| z!SCDbZ3x0E=yVpt1s_Sj?Mo3#cYJ-kKiTP=>!jPm!L|@i^p(M!)~tF0s?Y$=sUJS9 zAH>hc^1dl(Qi0hos=Iv8#;6Zo=*DsCA9nY3H2;`MP($$xxEoa;tQs%%@OkVXfQ1yJTkz&3f|u7;#_q76V`~`l@j} z?GU-lY|~X$ef3zUV4D0cW^HGq&tCg&=(*eb8zfpqHYKKxDbaxEVIO8T(esXx%i`VTlNBlxo#Cp9a0>lHjp3H{Ve z!rhc#6g2*H7w4cVttl#!6Vl@UzR6_U%zToqGDIIiM~$XKsWlqrCfo|_4^pM{E?79j z)2OY==u~imU)c(NmruAw{GeZLx;jk!I11Q#W+N^UlsHyiTo6TYkdl#P!9-!@Qdi)ddyoIm**> zI<`)#MtG4X;WYeDx5c&D1y9p({7n^c{!Ulp#XNn8JCqj>eIeDyDv$0vU&a_qrqQpd z{=1=;F5=IgS2cM4>&Y^~p!#cUbPDHuH0FCH7nSuNG=t3YD0BWZfPQ-wf9dmEGCzAPihSn2dga>8NR7cR3Nu970;tA(hWMagrI z(RKu`m-)JY`f6_LrKSkVSb5b@j-XGgI6P;V_K{n3XFZaW_R`eAZ+8WUPCh);AL#}T zQKd|8d7Z4+0%yu1+>sAtK9x;mfF0QnOaB}mzc~)m^1QoZC^BC13H}vZ+>{%@_m9Ae z%qZkj^`#CMAluitqi@158OLcH?crdo8}w(c0F~VXu|{$NXE8ycFf-iJI&SeR9{OL3 zI9JHO>A_0JIey4Q@;>l9^Vn`dXFTuZjqpexYO8^0;WfE$1MwcuBsy#`9%9NUXGu_3 zR_fI=#EpIM#9L7x&xxdYp$%o>B<76Xm~YHa+RqcYs?HJtJHj<}QRFpl^H^r4%^-K& z)U#0_s}Th+Yd^VLF14tTP)gdXre-2+%pUDFO7H%(6#$Iw4BS!Niahoc7XGLwBgOhKj$K`L#i1gk8x2ldu>kY-)7=ZOppv zA^vfEM&;kbzNSBLt`elIIISKOhWhLic`k?RmeiQr>4X1C{q#mvCjWheqpko4m52F3 zZMZjmIQw^rm|2;>+MXD+NK{ZBSnn{Hi-T+rS&Fab5gTleGK1h1Gw}zj9h})hR1E)_ zahy+qb9@|b*miJ+*L4a|+9;IE^<;X}-BEd9$}TE91i z$XK`3QEv7!JYyj;T9@SWE|=+HKOAy6RfmDKT%-KODttHB`MFPn4MR+I_`lM`vox?F z32Hh2{Q%y7yz`G<2)4dU#63ZF?#hIv6mZ2;V6FZG6AnUiUW!us5Ozs&^H;&QoQ6YL z4g1e7Fvn^974fJc`N2=4nHczhvpf1-GOz;rdwipq119P`J@SYsh!%3U23WHac zFn2mck2hOYS9HY6jlD129fY0fS`mho0$stF>pPt8Y z)>@v|^GzK+)t;d=-DX>*zm_;}?&t<;GutYYc5>$7E*C&MO$T#4M_z^3I}2mlU6iLo zuRnSBA)8X`h~4OZJ@8wwXIZpYF{(9@q8inGS2*`k@{GyN%^M)+k=w?Sd2@=}DjwhI z2KEb{VFt!Es`p~h zkQ+=|lN;l~%XSfl%to0Q0h4k8mqu+^my_g!^dQB5=&c$o8meS!CsnN`Itcn@CP|li z1DlYF9i*wqb@}8Q>cnPv3qpAdZFNI9!aA^(d1Wj03N~RJ-dvpJvK!obT4L)}T~wUW zi^;l^%tR&$A7IkbdpiCWs1tHDO29sK4TpRm=4RYgH(+v-cD8(lUx}3CWmENl*(Oto zKP#!G+t6{^g6S3#jOx$%d@Q^bU4G2lvAGMOa3&9!l;lTdJizuOW<>I-g2mrVk^aH6 zcuOT+jQi&jIdueeXcHpo6(ZVZ>e&}CEq&-+ugy;D(T;V_osI+WGWqea)^}!O#!W4H z+;%VxV>a6ZU%~8cX2az{e$EdtS#{xAp0Ee(F|NPD^m%Qdx9Bo7f>VGKU3`m!h}tPKjoO>RRFnW8+N!WS^_ z3+OQV$UMOLV!uv>cjqxUttAr(z7k3I>JEx2F8E>x(2F=yv0nt#^IKiEGn%%#5ZLOT zsLPwIOK-zM*$K_B4l3(snI27juFPdsL9?zV9CSHU2VovScR7NW=dG-Pk8K4G3%9d3 zs%CIs}Pkjh8mj=nC_Z9;lJO&P`Nfs!ITW2qN$sFcoPvxnPhF9(H42A>$Oy@QI zn2sUvE#2rB>_K1q7AYO~!5JgyUuP~mv9}w{bAm{EIys3jQED)5q^BV4=ge{#ZcXC0 zKbAHwqxLehdJNM28#XY2O279Q4M5ZZV$O>NlsIMmoIpofcij$Y!ntwuB} zp{|IIcn@pKaHccffzd8&{H;&sIC@hPRf>-M?P8!}?+`aLvvlD+J+C&2uX?234$FDX z3bVS(Ke_~UYJTRDOl1aZM%9Gcu)Fw|JT;y?@`SpTnOZQ%G2)c2fnT8)sPqDN$Oo=D zClO(=s7_5+oUEDx7AuWxDVnQX#OC_2)*Yzza#IyFclR zUS)`b;pzxK+i`fRU({Kf`26eCeGo@u9gk`}Rvr|k)N`|nNpE*WY289?)lU3m1z>0J zp6O_6%^>vegF4Ktriz%MC(F@fy9gZl5%k(Wb3WE3K^;#)C((3DByG7`Km-qFCeC-x z>{~LYk9ti%)HdF6BB!nrd}j;%BM$OJHMF4o#Nrz?7lFG#bqs>zdn0^j(V$y-U8qA~u? z`65QnQ!7CaP3gEfiwb-YzQ+%Say$4iNG9Fbs@&3Date10wv{SkF(_mqtnn>5i5)c- zC~O7MyCijrW3jCT{p5lHz6H%}gb#bTEBqCHmb6LXE9c7GYLyp?#T&V6lYsmKeE%)dVYe99C zn#{M+@sywKtJujcSj68I53>=&ZCJ*91*dbc<1zE>%R4?g9y(UxItrx{ID&?Kj;i1f zOk+;Ak<>;1uP6#L?d=0o0lGOpkn8rs;H*Mr7)!l15B{+d>R~xD(+L?Z(x606q*Jz+ z$c4kA0+@d^QRk^#!|h67e^+ukWft(h4c(#B6x;ji62E?1)}l7A1=FUe%-MTP zZW5|3wRID92EFML3RD<*^%fYa53FyjY9(sZEk2eh6Zg2^Dbe%mt4xm9)T8Byl*z;- zRREuQYB5_prOwNWLba0H)j<^F-%_}tN8^QF$KJrC&EQYzx9ks-Ult@#ocR2TIQs&J zMN#J>$5N5p@yc0Dt0+Pr|jh|AC zBfpL%YINmkdBJ`$)0Z<)#|Sxz%rsGb1v$j3j?OH^j9*M>9fP+$f*g{M4)ZK(ks2dM zf+-uxOX{+mDhHCM5A*!1@*c*DW<=vTIvc2}qpqm)IX{7cPRsnv`)f?!BJ-1oIot6Z zR0GR>qnk68Dyw@jpXiSWz%_eV{n44_F#M)7)ONZZHsQKT0TK(LE}wvhavk2^uW)45 zL>x}a-sFQyFk4l)=`V-|Uz0Wif(2gkr^=!e`EkyAsRn%3T4>7+R4fkZ-zZnDm}vJD zf5b92TfXEzhp;cN4vIh*A)F(b^&|{m6>yLr_@@z{ z;W50f&9iO}&y@idBPH>rh04XmhLiNbc3^MrCf?y~c!4LVVas^pHF-Au$lis;J+RDH zkxm;bLx&v7%^LtBi*jBxi|G7bAX4g-%)WUi*P~KB=N{w{tK|&d#$fQ=2yhMEla6y# zkY9<=ji_W(&@o+E`b!HY{|nx;O2mLp^o@KLPW&|2>EsEr{NOIPaav#NS*UB1sZp{^ zwupnDsyh#uGEsjw5nV6}JfmC3|-Ifl#{OvG!7YoRAG=^E_S z3Z8Fy)S30njacVw!k_F*MRSwgLcNJLndCeEjyP()PdxK2bR-z&N`fkIIIad4|H7V*rLLHOi)5B6LcYyK%uU6NgDOkn-=cizUnC?8Lg>f02409IF>ou5)B-5 z{2X_@pmJDCHSmiG3meg3|F5I_fZMrj-vEyIt^2V1Sl~Ix+ zk`_&}`+s}$c<%dm{jTdgkK;Ix^SoY(9^*V3 ztp{mfMnf}ndeK$}d$+aR0zE+etb~=_p6U)W{@|Mha`w37f;~|^ndI*d!6`Dti+pjJ z)HBiV$x|6;DZu-Zd8suJ)na{fZQ`q_kX$skrHH5BW&aGu9sf>d(Tc7%{pwg$iz4-9 zJcMfXQ2a?Uo71?Q89r0pYgRiNqXxJ!8IsDPX3{Iw24-r5zkNX!E1l??r?yR@PCv4vjq&vg^2y!a`mgHPH)P}zL!RYA+!HlR z28zqyr^>(>r}?Qg&}Uju&%|nR_FuYprUeKhsh-h+HdhCj+U2U zqO0R<;?Y>qa-V*cY$i;0H4Sq~az4uRzxP3f2a?-iu@$QJ=b_@M+<2-`+S%$|mbMIanR$cgok{vHfw^s#xn* z80cyI>MZg&(sL0efdD8w$u-tofdt?zuF6gv5$Dvg@ppf_H8n??1HZMMP)MXOO)YiS320){U0v!#IgYaK@lWcq zr(m-d>I9ooB~=k->Wy3;Poj4H6h8}px2J7fP`$d0YkcQMw%PFhr0|3(p-p%;8qxsz z2OD71I?jGO$m(M7xS1*g?ZPanSevX&#+&;>)S=*q2Z(D}|zHO_`)<^aus!Li9?;mGs?S_G2Y0@&+vU zQj#~LK-4gmgGSSwS~6FS?F-uCFJj8WP{v9VJAX~eW4}M98sj)y<@^5euNbb$(5YAB zr(xJTYYf~NUvTYRhC)M$e%RaY35p9yZ6vb(gdn{$lr|8AA;=;6snkGfp^1kQk z1n%XYsO&oT|Bi>zRUUFC`q~rk$#L8LjcNLW?$Mw95M8beKTiWrtn?(%^z2YM-rU5u zgI8pDok77UQvwg!zgzLyh9Yj+s7~-|FvGbYO}mUXyqP^7G@B3RD-#l2k`&m zmfV?L;^MHuBf&vD{<^TG{W;QkSiyy5=4R9y=4r*N(mCF$pT-@y81UQb5t}K!v*SNa z6nM(dEti>&CGC@*Df2pU#r;rMD{;Ccjcyp_{#9tNvu@_@u<_gaB8KEFkX*x8)B!gi ztb$dAqIr<2e?4~GM6YT!)vcB471PzBR^w?CRoAz{TFaucbj2cK#G@SK?Ko}=Mne<1 z%ipaW<%#;KL}v|01esLsoSb7t?1oP~gE>p;FXf_>*kg8#XRrO6Ns%Awt?H~4v-?Ej zf}ewZ_TR^*Tjs*xhfoM}2Frr&!E)JVXz*F^o;#aQxq~QH@m{Ff*wnqPW$=T1!3Qb{ zdHh)s5ji_7+Bm)y`^XL*ET=QHGux`8*!4`9JLdf1oVbXG&vkz1^Q+w$ZxAnbN0o7w zH{FXcDm6QrV~>8W8a~zPxqT-o$sc46dPWVEt+viaCS~APKBZ@(^KNF!l*eaLvwo9t zhS;g!QVXla>H6`N;@&UO2P*r`IUs%&p(=R)GjX`(*zQ<9`%R`KxhE&pi5@mrb^b|D zy&nTv?Ea)!oXO-)-DNUTF3fFzR1T+}!o9as57u`u?P4c#14sW-`cpZ(_NI6;{+3ro zprXka*Yot24PMvZHqM^UgSzc(OU1N-Pfr{29 z+Car7 zN9WS!gXtEZiSNuPolz@2nbZs(5MW9Snk%#k3>eDmv7;8{kUvfq=0c(AU z`nyfn{2$_UDw(F*@GZylY*miMFj6)Z%;!YWO36Ju1lKsDY3=(yC%adwnd!F;=`M?O zo!sjdfgDLo@$4xmqz1S3pE6=cSuTea*d4V}H?5YOv)3EM>mZ;`abe!<*`m$GXcPXl zOBBeI1E)okcp#6${RJVUZ`Gyi!tX!ISWu?58&3tC63h*k1hcJKRvK#^H;PRQrrV>Z zC|lEYrS}V_g}M0#7IL|KXkTaZTQWJ0hwFd&hHlf}J$ZZeb(XOM|A?!k@ zImDaNIr=A6QG}`!zHZ9FQNE;fpFvg~?}y_$e#hzfV6GX^Sbnvw8kDIW$xIPtFzvmO znvm6y;p@^{N<<0g>vYp*Os$U(!~=8Ip(q7nb?2lCHE%3FQ77srUUJwcTPgofWn|%_ z_#Y*#Ikff=UiGox_)gLsm+792h)PAdO|jS>w-OI`aYiiAMNyv@CkuCEd&p#csv!=> znTkC$!lAEAZldD94~vZuN3Vs7UX({JM`6@c9DGg2uN}M`e1Y)~4Cvv(n&3Iwd|B#k zE7gGEcU*J+@as zMf12d_+7u~eQKM1u=~ErPu@|%xG8-7IUn9poe(>s@uKNG7-~J9YYKLBJHGI=9PnXA zC5UC0490bqRQ3+0z{uaI@_&=c;r8kaG~`q?B{*+|a$3)CMadUcsZZ*k*k#`jG9&md zzM!sl$U5_xpH_WY9qcpZ>KZY3yg0EcSZnR~g+t9-jLiYQ+bq_npxrmjvo%*FtU&Wx ztisk20&5SW9dRNbHa~Bd-h}%^f{SwP6?B;oo!Np>ADlkBZ{Iz zuqtUmf1SsDcx&>b7;~lS*-%)ZQ*x`C%%!-kYWbb+BN!Q1NCw%FS8RG72Kzx}}vco*Tk+}AASl`_=tvNE~H2M63ihE(J(NCZI z^l+|w22Mf~ll(+(pXiQ$qoi!$UK-?e7E*1V?6w79{vqzAF9nGnQ#&h#q!{7_lH zr#$cx&VG-%Z6~3~Mi}if6XS1=a>(?5g;k?RJl9n^ywiE*3o~BwC(GdF?{Kst+`F09 zC!$B6HM_rG)F6I@61d#GD!0a+FtqIA<~$MoMg0sPQ4(jFRaB8iQBdZ}V}7-XC7!8B zIKX_w$?8x;Q?a*rgirlyDo#mV5_{m={>iG;cJIUVTZo{fEYg?We<<#$F5M@t7d%5_ z*%cNv*{4GEK(H(LI{1*IYOph2-3@g+eVgLpM6tAFl!xw)%l-LjekKl{D(r8o5r=pjOLDU^ROK>n2(G0qVA44 z5P7jwj$}o2oqWGorDPOrU%;w1Nc9hQrpn`m?la;RDo;6l!QFFT#9N*2c`>JPQZjiw zx;Ghy?>CW?E^$OOrD63H@)@7<@xG03Tuz-3 zA$rAQ`O%)kqPzIFeUdBv={8uezx`e!{6+6?F{^hIR9(S+)#rJbUQJyKeRPi>h;MO9 z$9Tr)ocnTg>!L{_CNCBrmj|lB9gIIqoHcxW;DLmuC_ ztZI6FcV3jW16$K6UQsD6pHxe}*PXFnALn{+u&2JwyX=JO)SxYJ=OBGJ-{JDq_d8E?TFje`>5h&n#|0=J4Wc~GLwkFB zU34A%o>!0f5xpq?#P5fHg`fK8MNw^v>x)rMSZ*t9R^07V=i_fpY_63|qwVTzPi^DQ zYL_mppS>Qlq@s@Aa{ZAF6~!D;KXJLu}}+rQwu*;b{H-nB<%-G= zzt8@@n$oa2t|IE)5gkiS$fy==NV>{}EyL$ylQ+XED!5K}f4E<|!<+-!*P$=eW>T2G&F9kFe>*8VYU}x|V z)*3@uZwBc&a2@@19d!ChFbB&0(!H2tvDxW#?k@uv)avJ<8Q$yOu>nrQ(ePDR_p(T_ zE?BGv{w_^sX;hvfFou)+fT?4XouhGLTOtGRr2{+(+5W@7(Z-C!Ls5SF^r=*J6_qD& z1@nyYmU`x9{>YKDolf+a>THx0bkf&B7&G9;C7cG2P|!Nj%E!8$yDcAFdzi6TyqQk% zlFG~kI4!4ns$=7|$>Y}QQ#kIRzgt3A-j7&9M?EXMGRo2obE++enVqr7H)WHGlciRuOq(VZ%DITZ_A$x3zHh!;ey z;G{Lddva?&{34wz0@>-XoHfrH?W70{2}bz2E1`iA>af4z0X=Xuw?o?XzhPpH=wL^2 zyq3WdXyWDY``{B9VQ08LnHG-bwtUB=(mLWSCx)0>LQQ5HP3UZ@l-VS^tm0rZOG+n? zLL*(x58ch3QirE$fO%0_tnJF^c(@L0S{E-&u88jlhrx4hQ^GA5)6K?;Sh-}b4slP4 z?K&Lt?j#qSHipjBkB7e{CA>duG)a!{#&cRc(xTi*KkoyNyi#9;%DBvVC$fe%+*wOzweZo~XKM z4PS*J4}4oS`Sg9-jiS?(kHgR=#_c}TEm3*@ZnR#`fqLebM+cKDg7ob&Et4hQ%@V)! z)5KfC+qS6sWN`<;pPah=38AJIOYz9-)O?+oQbdL3)MvAxvGgp zF#a?jI2gPT)}_uju-R-u`w1G3hwBRz0A&vXDL7CmffM(%s!TYMP<6xNaR=5{VHq!kJ z4~Iwagq2n`x83^&{LqWO-vc)22DzS=Pjb4mFn>5QUaiK^&K_xG4)jtQ(3og3XZiVX z4gca4XKg5rbcTJh1J94;fcMm8TB+C$OM1zDJ)*77#K-=-Bz(F~R+(&?cUkdiHN|g- z%=l-L4R`*CI(k0(1baVA+j};ZMXytZi6S_0rq?DAz z{@)7Hw|q7b2R{`Rae?4i(1nh2r%FZ*yY^ix6N;2e)dSnve^-j&JA*w@c567o&b(d~ z;b9o}tzeH`UQVvq`JYbkaeN1sQ4hwLYP}DOE~~uHe&WH$vin52xrF+)Iu?9*GWaFx zlNxJfO5@R$eOme!%o+57eth@t@#W|!O?&xEf5aNf%blib)#tjqlg8Cfz3BvXq%*eK zO;(?r4B?P|(v61G+|RKRlW(LG|4Znpl4v_z{8$`ks+V36zdP!T%1ue@3B$CEZc5I; z_~~2DKd}DkJMmtX-|k5saq9n7NVezrhu~d4E5XnMzVex|*G~6IUtitiNv6XS)q|Oq4BnRwVt~ z3V!4Ui+y(U2&nZejP@b^RVaQ^WJ=(enfzIeqEh}=RqvoU{9c1buuyzhF3Z$_wcjzj z?1Ik4rI?bgM}EuIvR-=rZdXp(9u&`_aaGl?-MU4Z^2Q8~N9Y$VVp8^N_R{ak=(uC5 z68v44Ijvr<@mu7jEPu`A1HgA^Ti{!7j*;ed&U; zl9S0R@pyfC=^J`S$vam&k9$>m3#$sWPxj%UKbVd3vOV>#C~~h!5)X(T`{3hg6pOJUv;$8>lP4i5JhiMSD;%g5J8u&Z`jC z2!@HTT_~|-ow5l&=^8g#kF-E>?3%px#%-dNTL?YFX_>C77~NdPolOn66uG@NJ_tGf zfbIT5sY@fN8!`F_ZoN4^L#>(|4d5X)BU;XB?i`m%X7T!-fmhGPwfGViQrho>t6ozD zUI-&B!;aq)p*n^Kuu^;It>gQo;97z`wztG>rn`Rl(Mvqij}B6mAS#{h?3mF#KH!=jt5w59ne10U%qW1kcrc^fS8Rz37sm}q?+8WiwmX@nuca~c- z)%)K}oiLS{8woBduX1>lqjyg-022CuUX@?<JZ5>FyUkW^H{JRuUUtv2%iyIAdp;m?Va3SB- zGnna4%r2M6an_$~;LP+cf)VgS;b2poi^p?|7_i@$=Qux@PRIU?x>zU78FljB`_hcYn4CA7Uq3R*ctCQF%i$Zo z&%;(gw+)ZcG}!EY@#8tWdmjZWn|+(e2u0mq{JzLJGaV6~jI=|v3M^R@PP(k3_N45Y ziW^YXXH(Ey)Ah#kajaBbXpc+Ra1O^s_1r?Wk%r!pnsH4k)2TVD4`37ic%An&&<;6^ zkq>aT)7?w?)BtvSp4Gvp6x8Qo(U~}GF>JOC#5C89OgGD!R|T)C3w#%>wIV;cx9VqX zHV)6J8~g&>e~vHr2!E%d{4abssb*5swUBdf%FAT6gp)xl>whBrTZY?fPVQ>|JWVz0 zu&6p)G-xi5w^SSaD{2ya73H?hl~suU(S_3*JN(;h{9WdZ)fO8n!?JfLnd+yRZif1t z_h}o3P#9|eO3i+P%u%1K?W`v?=`DFjSMzYFHc#A8|M})j;$UKO!k`PvsuPJ zMjz}f*1zuOC(7G@$mnU@UmOmos|t0G6TOK-IwQPM#_p+p*FP8&AqzK!vvC*QbF#O-7q;|^htI6WV)U9{T_-oHfQ*ZFK-pr6)( zvCgRtHik8OC%K@3);u?B|I07+u&6*pt*P4m36FWA+p%tvpB_6TwN~|Yu4-&eDp`N` zC$`fOmML%l72U2H`y$=t8cd{?Z233GNMSX#*6L7gp|m4W_V|OSy+~UF1Bs#85n{w< z9^YE-Ke{H0WV6GjFsG*~Cc)29d;Zj&wEa;KY$rSMC;6Nr!=G|ql>C?1`3@1GlQ_^I z9HJ_9t9b!=qvxmuS;K+Y)JYNGYjxQdRJ-ejEx9q;>L^&|XGi(zIlP5$+UfVf0XM59 zj=>ZL{z-mNqs=#9b3E=b>(!^i`wl zATBr6S26|0nhmwqqhd|L1&;EQ{Y;^*%1PSLjGBMMsKQXoic0bF`dxv&d%1nn6-oi1lxwiEy2^$m&?uLqo zJ4Hk6^_|{io?w(nJ|A;hU;uA=X8g9j7E`XZ4&T)KUmu&6l|y&>MaOg=!@Exve}?G#4$s?BI%^ef^Fb=}E#vJODR=TbBI9pWxnCdWR2#lc?!HYG zXTP6XBj?nS0~`C>m8{Se&|S{3P?9@%(cXHVh7nn-JFUxdmEd`*Tp!7KDvMA^8j}u& z({9l-Fx5WaqKf}02VO=nz^S@E{6?Mh5>)?`C!0)5xz41TiJUtRK%+14{-*5JyQzg; zeAYhe_8#Q$fxWyz^j#^#e`>w+2fL$M(82Ba)YbN9cNKs+Jgx&p)Em?d&WfdrRKhmu z`#Bii>`6nYp`NId-+q|mEd0-#`kxc=fmJ_;DRiX7EQa>D`-6AvmI)$(TeriPp_oG9 z8Ml3wO6B9nY(*Dz%K(jLyEyO)*FknG_!M>epLjSd)j-$4NP1Q^-1QkAqWFb zd7;Mfv5)aB2fCl)VLJ49-o6>Cqt8UI*t6eIRd%>xv?tAUw=8zb&Ur!9JEe*>B={v* z;7!!W?q3#nM^dGls38VWNgrtTYR=%%ZpL}bc^VG^j||?mhIipx6YQ~uP}r;Z*)r(j z1<~?2Z&zQwj0L)@3aP=ipm1-sTaRI0kBPF6_^hHdhEYyHCrNm;Wf8Dw;{F)yJRhZshn9agGr1KGt_OFmNgDG{w=-F8 zCw5yXx*_fd;j3TAb?M&Q_3{4hEp~*@PN_2j;A!>vYGUP1cs`b`Te*|8Ket~Idun}n zQp}hu?&RmQoNW)6vEwQ@!-H|%g28%!`l`xRhWcz?zvY+}{!>1Gh>ktde1ZAY!s)Wt zW;mj|thnFG-O7QWch2tZ=^f^VJ?=d{(!F$5RE>ld{Ql^EsfpgkM>) z_b87qCt2mfy_{QZVduNl3w)+ok`1X!ZJop~;pU^wJtKIcJb8^zvx z!}o$8{qAupiAUu5`Xb93dttgK-NQ$4{y#-GXVgM9;;V2wJl$MwEa5vXkU3wB8#os` zle7E><)uW>U>^J;pWZc+1r5t}@egQ8Ji6V}_2~d!3uN=mTfr zqwz@*POFdON9?^LafJ0AF~#J5o+$2L@w5Z3w^Kx1u7hTzm~js3sKX7|-pV$Tw|-MI z`AQ|dLDV8?#Mf~x#>N8yhZTgp+KTxNu}?E9M75pnSo$p3D5^cCFX(jmc(4Z&I_vG_ z4|~Z{v!TrNO$-O@xtpE$;lT=#c0b*^w_0i|m5*w8)#IXLf$$JTrlH#PR27(6BFh=r zth{c`@|5c`K^F>HcinGQajCf!s+J=E0=33|c*w8T?V^0NnjdkQm00iOnFQ^G{K@?hP`dbPwp0 z>aC|BrH`?*f1TWI_Txl#QZ+sZ{Wyg8rySWi*{$aDI4nF==fP=xmG`SG#PJRKZhxl! z?vHQ6QyTf+Z^mh*FFi%!xUBFCRq1ZCk_S3@Ev)KH|JPS$dEH4($J`&n`+`BiVC(q^ zf53LJd_nLuZ27y>T01zw)B2^o^q!cyU$o4Ow$Kf#K&B_4fL3yTF>#})h@CC$Xw8QN zCwV-s4JO-xl`)SBBE)3R{*uqhO%==n-BzKJJsUn9eCRFrf)<|O^KT_Heyw`D-j1oG z-|&DA`v=rFj>tZPxi7w=)s0h;zb1Z0msbsa&5dYsrTzB-`)dI8Wjn6=W~!Ljl;%-S zB;~k{@8r$giA@a?8Ggh?e+QJI>*4wk18#;X zeorBp34av|E~-=Qg)0~HPb~_11_yk0E>Ykst33@n>a8kxR21Fo2Di7J?U(s3Hj1*3 z<7ES)=OLO|Z~bY7WKZ)E}U!+v99e zY2MBZ>$-#IZizcaDymSg^4k}SjpOBp7jf%i&Suqc3ncU#JpKq@#Q|PRzUc6asAMq3 zNsnRHo&HU6r*?+?^^}U<_HZq%c^PYcPdCor(;FD=JSBFeVv9^7i4lvfuhI zq}v`dS_}Ob6H$A)>Fi}#;9oa-9->j-Dhk|8>wgzgPU(@miQjg~fAcx=ssA_8S@kW| zxF0XbZ7Q%iR1Y4J-HN(TeGuJqtn)VuaykvK*73iuq^I`u6a}o=!C;I(84gwT4K_s$ z#JH=iZaKT>PRy)|IIu$m9;KH0v^sD*`Q`{rbtg>webh-$aTT$24_0sxBmM|Z-4{MY zcRL}{{(^ao4^KGx6>*>MJ$GM!zq2}j9Gq~9vg#r#4o@tnm|gPxSK0XwP(bdZZ(f2& zw&@~VM%n*9%#CZVg+ANkIsGtdACp z)VJGVu2N3vxAN3GK4Y()*vOfFhb~Ztr=T&_`wZ_>0~NsD!9{vW3-MtRg)7s^p5;G3 zV_K#YLcCk-nxA}^rn=>xf;i^!xNMI$zyTYegWJ5bEu!yF^6*)8t|`G~T`qMg9!vSr z2gTpfaJKraw=tFD(CcG*4%UbYD^!ykQ;w#q^4}FsiErfioogoTUYM6Mrr!0d2!EGK z&Fh@1J)-|hDv9aio$x)p%qyY%C0JQzR1O0jNL|@OXW7Rm+0DLQ?$mF>m-fWn%wQ-Y zAO7uk6pXG`-&kOlN*ibXQBHwBJjttEmZhEFS$0^a7*vrS@LAXfYOO+%o@<4lG+8x} zsq(`2z3jgxp0us%(-=7SlFZdp-acrJzZM_9;ntjB_4n9g8%5;3@?d)__d31sYns+a z5JC?`71Y<%Q|)QGopJeI;^7K9#jh}6<$sXdA_AE&ZxLqoQF2{fcLmp zkIXl^mA}+UpPp859O_Beqsu1EC=#n=vm5CnHQKYw*WPhFkEX{GgPg@+Ci0Ty}wd+i-Mj}^&7@vLE`ui{Pp z00NzWrOs2Y9!06TfNQRX^WTn!`x~E#6HTGWN#0^s8LXs?)XkY5Dl&{wg&E{Dm}H|% z^Cokl9>eUj1heAW@Iq1Ut<(6#4I*YUy|jU|9>|;x?9$C*;wTlU=kbF2;TuumWVo}x zj0-XHvlUcezr|yV%G0}Of!~DN+{~B9&RrzyFAx7z0UgW@^qhD2gDDP`;ex^X{Ay9{ zM$@g|NV;((ckq*QsWsWuY!dtZWb%tWdrF>}CF35qdk5%EPWioSb$sNtWB2nh_2naY zh*B_7>}lxM<}CDzvHnwo4pKE*>{+_2ayNH=pOx27sR|sI^&7zXMco|yDW7GDbOw=? z&)LU$uXO&wbuwonUmxW9?I4 z!Nu!PW>2dye9rka#;m6=_<1JF0W;#p$#50+3u;vFMu&8lJs(|@EK-MEO zG}IZt8GaoV9G1`1@o>K?MHB1V8#?_o>>R9zhWR4stkZ(m;jV3%SUY+Km*;Yd^P|H* ze8v~FiM{e=!sT(uI<3X@el%PDpnZJGd-zKZJ)~3WOPbWRQ5W99B6fZib+L55KHvmS zRFAn@#5?Ph9_B)OB^sS{)j_-gI-03puA~ZF z2|KH0`gAor`%gT6WxN~CxZWQ87S@?5Z>)yMr~l_x59r(1@j^|d&s}z+KlWZa&{vN@ zrd3sj9)dmY(alv}6!?G}qAg}I z+mmO(Br4j|6|uIm@NFsBU?pX3lx#3DDi^#W;@mBhX3BmPJ^roF_ys3SNd75s#SnqiA?mn_sSJ7pMP}OQfQzP-CFMY=a{Fd|?718&c^ZVoM{%N;4bUlK< zXd3xdpr%n*zsIgVl;_9sSab`1vN8?jvgbX;!@(2y>U%-&sEl3x4M+9I(9ay}vCRHx zrqf~o#j1}E);>^ZX}P!{rM5NK%NR^!BE9=guFT=i_q+DO8EbJ2qRrw7zVUyH=mp1N z+j7?7(co+Nbf`5x3bFhd{-4ge2kqq+;V>DYoVWftweb!4^CGokmUHr_D3k6Y*Gb@~ z3PLy=%%r(1Y~wUv##0XJ?#WBVc}~yN2>ZOhtkR0gwJ|OyD$c+xPG>xpc2?E|LY5h)vn#+TAZ}3I<5!dCI@OEz?t20pA+U^pm^S}l-V0V=<-8V$_ zowTwS<=^qNhTSmQOnCR07~F$1{v*itcCq6oyCHo~R#X4}Itrud@sM~eIdYdSy-bdV zSbTrZj{ZH$7T@nwcd-IF)sfS8PCN=-jMnRQrFvsWTIl0kojszirqwm!$F2ZvrF8Be z#`v!dX4{qhWcDYb>}CU9tLoE&W|{?acu)7_Nb%=sXK@e=Q4Ef3V6U?!8q#8!l{$u$Ll+4HG6z*f5XyZ`tdzPvG>_!tdoE~2 zKD$^O$^rRThe*Q78 zyHm<`_esvlMYm8&$`9!#72FnyB7wW?9?3?jA|Kro`9+FI6Nw|~xz~5Dr<N11xY$%QNPc5eFt*SJVml{E~$R$3J z-u)-%WvIUM6=aSqmxr1|AKNjTA0)8?x>$W9hbuvq0 zxy4f7oso9#hQDrww5GMS$S$ge!<61mC>hLcwEi?(;S(NP(=cf-W2L;t)OdV*dCBhX zNJdF6SGaC|cb>hNrrG2>_qaliNKUs|^2u)3MM`TN_fw)uC3Y!~+|z2VpX72MC7om@ zN=~}L?wX8nBiuAMTY5`x_pe(akz}BZ&^~UzoA0jkxgs*jw)1SWwRAPW+!a4?`SjpSUv8i`eK&U zrs@a%MQTbht`p*Rx$b;Z6YlSZJay}&ka%q(OXWuBGs;BPdZvt)f$o;BaF4Yc&wQDf zxXbDckXf2Yz7iQlwX9Zk%UPX6Qhyf@ zTpc8Xn`4;^q0%*)^(!(zEp8P`R>ear}QQ7;=B3MPg_e2xgrbo5BEVT>R6fT zf4AXURi6{9?R1p<&;;a7drjfaTNJL{-hI`+resF}$!%rG#4);5PfH1#pcl2OCDqjS z!dChD!BO8%KltWS)18o1?vgvH`G~?O+FO-fzAR&8g}YDoC6(zqflRw7|F}s+U=IH7 zS1InkkRK)3jX_#bQp;j;b`1A{fE6#c`vJc3cX=r^oZpm z6EEsQ?c@%L)96}_>qL_j@?2ZmQoe1AJeR4mU&5196ZM08#9qACB$7%h=@a%WxqHkG zp9eom$P_8;{vs-VvRj|{ja}?T7*OGW?3BS$QIc9ZX$RiyV;8z}ui_p`UAgP7YZ|Ge zQ?-&t)5&^Ek`jT_HMYFcR+?WrXfhCJH&I=eJ*uhcS<(DN+krPRK%V08PVCXl1two8(bsAg4f?rF0e4Qd0q>1Gw=GMqh=__+t zuT9#-B5Fg;t8qZDB-&2K@q0z26nHuoJRc1Db|!8of*M04p*v^!dAdI|zBqQFs{2RR z%3J9rS=<{*;0|)9ZP?!{?lwpn%`GSTv$=~r$wp#xw43N&O9A({#MK$BZddN}f$Y{= z>e!QpGC?{L2a9#7{3&B~iR6`4c3ThXGC9JZUvrB32wu~pAB(LPYI|HI#mDuivhGBgUxZcuOp76KX zc)k>plkfWEE`mCPs0#BzjD75PKX(k&o35&{$e)N@yRc-olafF(fYv>9f@IZj7DpOL zSb0G1ca%$3-Kc0*f_Pi6^V|`Qs~yeDWpMZc6(IpA@KOGgdaP0^N$Y-aNAFnMR;=P~ zFyoy(aD%y@U#T&hrIg-rE!{@@Lq?Fu*`dodi*D0IVD5VNj{8|AA$CWz z+gGd&t6NYyX=JT#)vUagk_5hyJ)$lTW*1Vpz107B@{7AETitH0O%z0sBz2vl}1efxFIU^;#rqGS@NJFRtiTU=v+;LN)@Gok}T%AE(x+j5F*KKk_k7#FV zWl?I>O&O&_VF9N#zxJ`{(pvj#GF`yl)KjnXHHYMuGy2J9=^hyXdgr80?)^WuYz8|I z$sygNwW(D%wI%oTMzVl;v!sGV)DqO~(vp?h^bc(1v3siVU2C_UdOV5989|*NM~?lY zVcZS()a?UPwu-s;x|)?+21Z>0Z>DH8spY=2Cy#i>K1AkIaHRqDAcI8GwN#n*5`n#l z4Iadm{?=NXT62BJ)BdT8wUVr{gPP8F0Q)NIWLL}m;ReYJ5HlZDG`yq-KR)oeoW$cQ zH$#re0@g7j&%6o5&jj1}LoQM~zYyQaWq}rv*D{4C4GZS4W#6mIZ8@vQh`P5RZAFQx zX|xenJ-`b0;BPu;V*RA?ErdK94PP40o*a^sa0HXP{3kxwTWSfd6*+l5w623qMdhhQ z;^#qR&ky)bIqq{X&-_HTlBbU?zFf8J)XvUCNpD?9q{btM&w)B&BqJ>9xkPbfltt6A zMEf3U$1>@u$!(@I&|j%(KjbNU(qBe#2NB^O4eXG#ly7do4$;Q&q;lYLSMhE=$ec?0 z!Cxk7IDKg6Wr^O>2Rcgs06CiJGP|tpx!=5Qw;M;yrUotJNIHHl26sFt-^q7JM0TVi zBy;E8ztTgds<4YkK)r~pLt|UQ9h~Fphoqbz37V%MU%Kc_{Vu8WiPZw-K4^Dss>5{} z-)M5pvg<5rRb_o(o8%Z(>JPbL_k3cRWs|+YQGbJ9eUa1L^&HJe1s$w=h|(Bf+b=x% zLp>_{b+lWi*!a!nzz}Y07ZeqPJxjn3Hagg{4^`kwk<~h9j zFnC)Cv~EdObs>|_!Rj8@`=+jO$upW z^1cWxV&I-yR{4N2`pNEAH6184>lXzSs^`(zh)Lqt1TH9c) z?{g91$E2igu&9<_SDLeIQjp&`3Gdy+{VwD#5=le7t!XVMY&xN&WEXPlb}DsK?FQN$ zpb9-Bqw0X=+chj`7nz!w+dbfk<8i&V`pta>=`XkkQV_Ii0IR-89f=B$doK^+Y<>BY z(K?8D@9aLqEFQ}`s(VxYn~E8QXx+pAs-ZKzhbg|2lrW4;8d>-z*i0+^4gUQ@`>_`{ z++mqxCvBhglRqq)e9>mo!S?vY_Nz34$K~bT63RN%$2C^A5jnjA41WN^C4=!rqDBXx zZfbe#UTYNibycz<4hYeOsy$M!YGx}6);IFK^#^gWU-J2sRMf28|7$I+O(n91*f<~6 zvfE^(8yk@%LoSpyTesPJ$1M1Qkk($X67^iegfOoa2-anIcr&@~LPc|l^pj8YSa=cpZ> z__VX`>Sd+u)QGMp8m+xn&{A5!EBhY-d`b%ju7#mJMZ><)#O%bMR^8_YFY?O-?&YbD zCORh)Mem7;`j*;85~0U6g02IFhw+3-rIa|H`!%Z)hG$MHL-^LeiQa{pTyMk4qu4s> zO8rVJy~x=6au^O+h&6o(!+szo-Fx`-SUA8K8BYDE!wMAyOP>-MQ`~9RwTCQs`_UJx zSef+fd4FpJA55rKWf$KSoA}AfO3iYoK%uj4qkBnZNzYDgk({u{j`D_xN}@m6kw)4A zm4C*)v{dk(hmu`0T67duHn{6!TLYv1OTxHoaDXpT6cj21EA2{UZx1R&ln(sOR}lLl z88wAy?n#7=f-$y`uey?I(G*+|a=rq4`j3@`KgZNrWNa4d&|B?FjK709CDK%SK>ubP zr)zPv-AmTZY$eaOTfXZ=>p{jJrn1jx1^bHV#x3u4+BiL4npNqqyZxC-2Wjfrb5Q=#}jQ^d4pfwwy|0?Ql?lfHT z63FusMc$7mTI>e6xi|#Lh@zYD_`mgvkF6hUi-n=SRROJvXdAF{bx_b6YeRIMX=SNS zyl=GHt%3fq0#X4czRIq{ z&o8n&$NtY)p2J^zs)z57)}6%N4(VxY+&2MI%S6>LhEgfre;hYY!uCY1{oe(B@AcN1ORJ z{JW9G)UDP-di!lw%u*0}si{Nts1SdloeRqwe}lYV3K~rJF#;p&Cu=o(fi{~ACrF3R zSR#9^BQ^UjwXmw>x80USFUeL5+-ZsEM!mF~Lpdx@k~Wm5A2k#Op=S?-m?2CH$>CRjn6ly|GS&M_k04x#!+#3Gg_n zwXuxk<5}v|M|fagxlX=~(?@Wr!!WfzZm8R=QNe;VlA75032rZv@a_jb)F2(8gL#5h z#86pu*GrJ&44HQaM%C5Fw3iys-6ubPw?@7a^?Hxp_2qFncG@HzVX1v$u-wRjty)~y zSg4}D%inC!NS4{A!bME%DK_gALOk3OB|%r11QQ9I1rOroo1}$ZCUG1!|u1kqdnN&8BX(DQ)_wF zs*c;Cb2I^1+Y&uq$bEw67U7xeX-2ACXI!)v)c=g`fOMzQO@$|YLFb-_pX`vExNrCH z5VFHX0=RKOSYt_i!)q2d^4^QeCW_i*Ew#H6Rp_3UM{~qQbN7}OZi!}QHLg(wXTz9Y;M@F; z{w%Mlc+#+;bzhrPcQe8PPM~jA!$KqB%M8`s z)FyjU5!r2t&T`~YSl?e?%MdH=?*~!&y%KH;b#E+@ngA{Rf=VA2#rB%)m?BXv3C=?# zEl1@{h%a;&92v+HU4s|gwlm;;dL5&=$nyxkwyl<<)(0%OVzFg_wPoMlSy!s&V@=`j z*x$Z|FB%ln%{mW%r!86kil5qQLNH;G{jTZAsL!@RDp1KnIoM>&paX1#FGEIzp^n^< zmll>?945O^87ENIU)*7Mv4(mOmWQ?KfhwIVHQ2}O=*^Azu~T9D?@&w`<)bySk*Kaw zJWU_mqaTXmXKjz6W9LgX_r}Ju{)?pxZe~;W$;QALGD$hy@t0g79c*qA7>MI)ad66q zu>&`x2H*Wn?#Vcd2~yk(8tE0iAs^fYISPv@U{T!;*Wdjo&0T-=O+u>vOR8uK98zi) z8fh?hJ%i5|qC$n&6B?5WH_qC@ID1GQn`Md66$L=twbZ5vT2FJsXg|X5mg+}~3o>jA z8D|}W`1(qh_@we)=jv124;$U@C(D0YhNsIfZ>@wyvov6OQ;SRFFY#$`yjN&dAF9g> z;bBY#1=jixI!}&S*Pyf=2g7m`@15u;OxMLIgOkMFNIZcwI+FS{0G_*1#&Rch$-ZdR z>&jpr-2if;4t%CH*fCLZ;MIRa!+xaNZ`Q%O3N97avV*CmL6bkZg9A8=j*>ZLK3lSk?@B~qQ?f{^nI=oz_QJ;5kIWKgk-jqK;p% z+IHL@#91$i&bp~(^Z$1}J;b?!>Vt_UI^sXGY z%D$Gqx3qXPAK2r|TEYfVd9v{HAmaBE738d$hR5w63vO;CvsS`-CTlZyg1mZ!kN$}q zKWaJQdM9yT2BIPF%LeI*?^{8}QQy0xU;YH~icnb!;SN5BKUY9Ejw0@lqp?O2@#XOx zGSSPK%-U74dc=5dcI66tU&DK=AvJL$a*_`vHOWDJ*FuoM%4nxg%K-KgnQUYr4K-kk8_sT6L0v}M>IubX3yYY0-cCzaC zwVTzkh;kIyteo_LqnyFL*(R^?+Wr7>y#AwG!0ZBar*>#&Iqb{(u&nANJ;xPpT17c% zBYhNGj{Ee%x3kgm%16{%=;-ej2d1_F$0!?`X};E>*5uN7u+}QX=LyXn#Irf_%-z>N zg50dtXY#PMMaA)qWT&l}W%DcGDD81Yr&|Qv@Ny{nCDerPsKk?!8Gkq(okCD*EjN~CbHdNz&y0hB)ciIHKL{9`h!$`3cCPeuEPmTkB1zI%!(k@$hE7efhG1p z4)dJVWwLt;au>&$Z^$m3z=3|poeZY_lx4+k!*?G_7#?k4%uT&I|9&=IV|Te!_0I+UAjr`>fA@T(756a5>- zHx%uWC*+u)wUtpK)8vc81eTH8*M?3rbC|kn| zo=qokJ6?D@9YambqA93mU+8{Cr$(lwkJB74{0Pog3i)K!*!MhS{&f14UvYM0S}gIB z)xE`I%HTRk4*cYo4=N*rt+9c!Q?CaQr47l<&@$q_bk7-fqtx!@s=tbNj z{(fjuo~0<=);o9}Z%}SOL7lHe=YII@JUGJ?>KNM6eRY%QU9M&&pVP@1iSrUwhoDXi z@LNU6_X#knw{Yy(FzQjn#~Gfb6qR8)UO*M??lV}`;JhU#7JJ)gon~3>J$hpy95p=E zWG@(;2i2U49%T)iZw-70c+m-ZP~C!xAYDKFt4jQn6@J~G-a+HD%kakPll#5pU+^{rmCy|Y>IvVw#2Rtk(K3WzA5*?McVZeo?jO{x0c1jDzPT*b@Dkbe3O~0D^(dO%_k+>pHSK`KFh^Y_*(2hht;T?x&eM24ugu4HS#RU*AHI7(**o4>wlmt*XN04~ z0zpG#eFCxD$X2jsJAzHR&2m@*^zRJ6klL_XPoWOtkp1OA^XRMtt`AP{8(2*ml;Iv& z(0qvwkMH9y*>?R)V^}zFVRR^)CBH(ww#VRcBB_QWcZ%40Cu?w-bHYJx;j$fs{fr|! z=|O8<{{9RMCM>xaQ&+Gy`SH9W!LE);1l*!raQZiNHxA)B)nheZgTT{>|B>KmD|U8; z#G^9*B&tu~!AF-SRKTz(&Vv@t9LW0}Z0;;atUX#j0X6uzKBXRRp$g6M^b2yQ5s;?Km!t=q5~pk(ZV6tV}seNp)I@^R<|+N-xm(B;DWctb1cHd9&7}#+Ac+ zp8$>|mrB02ta9Jk%ir}X4*hQHh2~ho#7HbMWfO`xJZfTr4y9%ug)^l^buENZ=ApxV zpZZjkdy0*ZHc&sokNUGq$yl|u^x6~^l~umLwK9@5P4o)&AO()yGaQ6Ubh%y-P2uGv zOn)e!PD?MZE;W5BuEikMtptu>IJ(92$&7mJT@^V*oF`ykA`^jA*yA_sQ+10>HQWI+ zcu$w&sJn&+RGhb3WUS$-M76?rZgarGk95+W+Fb4^8O}#-8vu5!$7dWN(X1&kgo5^U z*}oHD?Y^FY52nWdO$;kq3!=6JWgDR_nlRll7%z1y zeXl*N>}vYlAE-$~>6>nH&*%qFVs)a?PY9h#s==q%QMsqNb=3drsQKF{g)%5fY6a^b zjp|vAdn=8-n*klN5hf8@ zQLlj{iKHkjYpXkDn_)zqz=BIS_umBVz2S@;#xWUwedJ9{be0dm>;b)2d*{CezAFGKCE{^TASzb5PbpoZd)AyVwSgj zD2)kBFKo5x>fszIaLW_Y*=(r)!Y(c|fwNP4`qk9bpIXEIu-??xBseTTLE-y&*eDCyR z%MuWut{8a^#|887h%7yO(t_uz!pg0rGUv8G@u|871}|)xfWz6x6yx@hnJWDf8%dd=tI=PH*Idi@Cy1f+x8i?78&pPA-w7& zjCC_rsyzI&F-*EQ*B%MOKjD57Ioqi6*U?j9L7JXKS{yR>R~&(y;KBx+kgOnc0?_q3 z+G!w+ZYW%7I-GVfQ%&!1y55i{%W+*g(F@B7L))yw-AofEk?Ob}eDf8061n)+Ma-)G z;2N7XIu7eIO^Y9r0H^-7eV{@|#W`th1IUFeFtmB>(^!0&XXvC6Odlnn`XofPZVq+0 z^%u(kgSuvKLEYs(8vV&_cn4$jSEj=9Q#0mL)wbylD;M;n8gaz z1OCBu#(iRVCee5SM)H6@@o(&T3Z7^eNH?9h-A6QqPORKyW~Ch7PYgPAaWw*+-_6vy zU2+@N`VSrL3``E4CCV@1fTxGgCbAQtw&9;PmRMRJB#Yqsp~o81abF12O296Tr0Q+L z`@MwXPsVdUqN^~Fe%S#Doeg1{4bE2BB3c9P{#QK@$N5ChbT2XgH|qPRe)fZim&&a8 zEgu_(dd9*Kecp!Psif2yRskN69+VqQcd{^CCn8?NbgtVJcE20f;G})B$Mja7*#x^y z7b7d2w?ENVLss)QZLGCV#ho9t^~`b9r!O}FT%7IG&`YF?;bT(`E4iE0GjW&clQ2g~ zE2tsLwK#T(e!(Xti_;pcQo!Tx0@NH{0=x zkhK%cxG9eBdwAd%@^K2C_eIPfv}fWc1Fppy{FXN|Uw`#uQQ{>vE0NOPm(~Mz0xoj~ zr=%GwFd>oGoEfz=7S=N3qpU*!RaM5Y#pMyG`zDK zJDS$|SFuB&2M0te`GUBhkNK0kxYeE6y*T&+zrk5I!d=^<6vk6a>ap(C@vZlgt$jd-=v4fU z;93{@p+$+btFYj^a*Z5Zhr9R_CccweU6AU#8_eBA)ms26XT&F)>t28g{fWfkXyV>@ ze8xn>QD)+@qZ3p<`=(6#-5}CagI*EYo9^V)H2N&JxU(ri=sag{{E0{G<_VbiF|s@i z%Cxqevq3Pcv{cc<%o@cbcGv41dqVeb4s%Hvv@xsENY>&qytWW~is$>%lK2&L8YjSx z&e2zTgbz2xo>)ODUqO`QEFA?}J>j~M;2~dNC#A@X%Jj8%;Wsj2MNce-g(vT>Nj$h< zPgHg8P>lh<=%fAcPJa0MRvUI1I^)oo^*liR37z~*=O$2Hj=||O=zi-5`b}hdXcsd_ zXF=~_MBX^M(?h90iR}V&PgOzPet6MWiSwKmA1)Ds5-7!UW^}LVc0H%ZaLkRR{yYGO zD==}e4BVX#O4or`z0p6JUY>z#nVxB>s}@7&(xv@QJva=Tz0C86I>dV|2?%$ZT)#!s zze3aFJ~54$kSr_@&&BPbmvF@o!I8SJN8kl5v^Vo~W9XvN{U)=Xmm~$4-M_)3g^(S$0(I8t&sP_4yP|cYgRoIrQKW zx@_SsEK!t>PyFCMlF`rTX0>r2GTnK{vw?=7&_4;#Q1ISd5c6 znCK`;CM?t(mV@tLjs>mrjed13aOF3uz+$vQ6wO4o2Xe^D(Zv}bHg z*k?=B&m$ryh0Z27vuIKJrSr8EJ;;gjBG?r~qH3SCH}K5KeioBo@%07MbU&%jwY8`p zXZgVTA-)KnbUlzag>SB-{dwOvsOWpjdyB+0`CF7mLtPt0@bj%1YMjX{=3jRERz3`U z^JSXVGDv;PN?vr8S$c&jI;EGXQ77n@Za@*mLO=c{ zH*h^#;%)sP0)H|Yd>lXRH@QRgst>*`l#RGJr9rKQU~qWY?PW+;~brC)8h@pH{U-_;kxG)8Y*x!iUd{%?G_MXh*k3dlz zxAML(Gnf19vCg+{I8D9ig2(pp>}fE;3&_(Pu2ussco!s!8Ta>Kn;}Ucb<0(h}Q>nJ*7R##r>?v zQ7L9wc;3Ep9A9)YlQ3Ce2y3WoLv#xYb`O(C?|Al{)Yl(O7UX2obpW%HX>iU{p@7@! zE*RY=rU7n)kS2e?29gue^U+$jsQmYd=G|1!OmNclXxq0afv9NF4=BgOHp7llp?}e6 zpjK-5?QL}Hby&p?I#P*sUa$?v^f*rJH=hoLlT-sbSRZtdy|d{-V0)Rn$`~vNUfV!> zg<~}q?U2Vpz06;Nh_K%AR@axs2cM&fEzkmdHod$IhFMy&J%_b|zjnYwxCaB6uTyQf zAL`?3X={(Ovz@8@etOi8rcxKzJNg`_F+BNDS@Xc__ET&A!U^7pUv*pxQ6-y$aTmG& z|ETBhnQuA`XCYgtBK7c+1m7)6XxCf6;xomy+;p^VNiq5gmGLKrFxMVW`ooj%yYFO8 zUZ&eaP|7Wc?&P>C5Ah2wF}Hk*$O|X6a4%~U{Y7;){h4s`pF03^s!Qxtp>Hu99{h+7 zK{KYoYqQo(;08rd!mW75a7-Gt^I6!ve(=*XcF+=8=yTOW^R8pf`fGAn);uEeYp|K_ zYjl6ue*%*-*bS=62mEw}1&`L_sHwiP!|z2yw`Yc_aL||vGn!9S(ZPNgQ*sYsswG(Q z1N6XZvKoz_ROjSJ0qqV4iHql) zj2Q@KfY6zBH8b^~4BfF%XY@G!Nq<&t7v9@hM!Jo-p1);9^xO z&?eYKYWU%1OGDj`!wG;J;6g1t#kQ=@2G%|s>~~lsK zQG1-D@@R|t%)B0;#}}193C}&ZC*MvJF(+B6Zs1xcYEB8OW&HUX zf6|Aczp@R#afhF-&4Q$y%gIT6U6f}Q$q)8bQEjVzDjzPm?`Qcc#A{@#P;nGhcXD;1 z+?Bfj_lbu|H`Z-8-a{;Qk5fWmXE8dq6>&sP;m)3AI&l=SxB(2v#A;uoZ#WIrmxAu& zcXyRZly*!G42JPUVg4cpPC_);?+QA*zccaj4yUyx*&fq9W^UyGb?SHU} zuGC;gZ=A!A?Dk}-?BD1;of|xdbG<_A_9ND}(qGtS4LIjD9FMjRtR+8BcEn1_6e~$j z=Rf@StxO@^V4g1}xK|1{xdO9+<)n-23)1z5y>(^{z&RK}NK#_-Af7yx36J4B-&B=8ReILH4LrC}XlEC7wG7<8M*aGenT0|)Eu-CExc+_E zqaDnfjUWelYP}#fcd&@b!4)W?M(pi68wnG?ii^0NoovlCcUqLqK-`;7#LXM(KsH~O zKV6E}>t*SKj2hn;@w@387@ol@BK03;d@9=-(6T-qsP}Y<_L7V6PtK6+(+hUf8j{KD zEWM9T&D@Az^T9vU3gBr*P8(gsyPbhb8-QP%j=TBIw`PA%S}Hpdm^BT0fjYH<@b0|! zAv*gp1KOBs_X}=b6#B~tss1QiYC$>rgH#m%2f1)TrorX&lAWju_laF!iYmx0b6@}y zB`%)Wa1}UtTzFP1{GOt$@<94q51C}D?oRWYAJNB;ajBL6PQ^D3#Ph2HGEAqh(>t{1 z&OC8ky4E%P48C;@cQ&1zxus!@9prkcJPV=XtwgGfjQa)?7gkW*x61x#h0-DOeS@vvYsT0 zhjXRb))a>NUS3%_KM4hrNDleZ^ym{Zw>yaH83o5@IvIKu4%(I;PH$;L*DxyjvVpY2 z)67qlWQBQNWjb*yu2VNW=es=RL!6^fza=emNQ*$#qVTj%tnXs{nu%^OxEmWin1S!w zr|;-%9+W#4JE)4?|vOvl~eOxb9^+IN%# zekL;^VR3ItQ|-5+$i8b|)LBpbjO%!LKj}==!@o>G{$-<^To0`tgNfhYEfwo}9v@%^ zXU1Z{H>qLFMD3;1^9c=`2yWL}!=rU;qW_A)(Uao~{;5k)_4Vkb%y%O>6LSKTP6`s| zl{To4Eoj=aOkxy58Nc?c@Mh`JQCG|97IW;<7xMBKIztV873Rna(xa|I_wx+;y%X$U zI9UD;hW~>;$!uJUtHDer*uz;F-y9b;K*ij$^QfyybW%UtdMkt5AJ&cr74)AV3H6@I z6Xx!VF=OzE_01v6ZBY;rbZ=-2>1rjDu|WBa&nsb*FZMdVBbK#`I(jZu$h7iPaCJT`xH9!~9f%$lkLo^Wl}f>|lH>fBA`%tQg=SwhIzerVZRRFok*FcbTWS zL7Y~n?^e;Za(|#L8oRZ+gSh+^M<|94!5Mf6PUK{^vZjp&JvxW14((}47hI;ooQ-{j zLONotLB9v+t@&VS4H(r&YGhok>|^-IK38x(7(nGcMePemuFL=rs|5wob3cR3Jb6#= z_-sl1fp9oj4g5kfum=&5fQk3(Xp%SNzqOA2QLAlXHUa(P&9wNRvUyCotgK%%fc8PNKkBI)|R4*O)%Jug(nYdaKL) z|3qBVGjyKck(;mZOy8plvoQU!fG4^~T($`H199tr_!rC!Yy?F!`kT!2^ss+@Q~b?h zOrB-;rMDG< z6Bf*|gAobrE)}mOEUXf~^f%5aWuvu8y$)PJuh5te{p2oj^&l$WZ zRI+twl&3Jf0iahrcI-JFg-~a@J3FvL6EpKQ9lvxYzT;!p309R953jy{LqFuhrEP7Y z=Zvf1M8yXej^m9M1^q5?79gda(3HL)UFT{{2t8wtZwV~Dm2HHBq`=c_>sJLO>60|$ zoWwSJih{YqY(r?RttPL1IA6wJBlCt^FZ!)TyyI!c`u5DgXM}CUA`_Z`3z@<1rD)&& ztdp^q0@JKUBo)^0KC1rLpBUeP)WP5crmuHM|P0B%&6agfmVd zV-hhj``st<#{AQIx*&H!i0X6)4}gGisPc2^)V72xT;ts7caS(Cdl3~pJIWKB-?OFj#3A{Q$OdUxH@v><`xT<*u%Q`7_g35OmL60mwp1%!jXM5 zw0j{itFeE=Tx1n|sY-OfS6lLsO*WRUOKBTR)e`vfM*k}=>~=a~*Xd=ffDtCurM@1u zW*D{h8P)GB`?gfNTM504A9@Y$I)nHeiMMk?!r2j>3({Vet^NjQjt{{*cF>KPDf4~( z;40@+Z&@MSlmS;J(ruY)k$8!SAoeSo|+G;r1PDu1x|_K zZKY&h<%0GOesVrzKS-Mk&h{7`^{f2uBeIKcv=~mxb6np4EH#mTL)ZBfc(bW-Xqock zT1C05!}NPcFa?|3r{TJ%L$<+>JiU!6eE(^mjIKs5>Ru68|65a(Rt55^C`ee86|64% zsY_|#1l{24_Sr&K$k#2#c zoGd_FUG=lU=hb*MGlK^>jAJ>&T++7s{jieIw=U$dmv}5~t*K8z*D@*hlp9|zGiz2fc65lY;0Dd)>E~H_=6e_7Ic%jiRKRCsCIlC7H(GxvZtOB93okPj z69N2~2l5zkota7cf_jJ^!z9$sKlFC)GL4hoH>I~rgS1$ z8|L^bFq=}!60jC8ncjUs*W@xCP9_TI35HIbwIrUx^1hMR)WS^uf+a?~rXq{$`1`tJw}uF_qo#FvJ>tx#FxRLJHu3G5~@~3zCR~C zDK%c>MQMtI7ZZ;&bVhz1e$84`Pzozz^rFCw9(XsYh&?(K*2K=jaR$5XoL+qsIuFN0 zK{I+R4pk8wpXf5oKbwS}_FG1GVj$c$CyX%%%*}jK;_w!%#qgyzvqJNjVcCnuh=Du2 zUtgi=rc>v_z~(FC9?w&=-Eh2Elh%2q=GAE)($o%@=~Irt%l(=Km?TfZ`9qh^suAQk?aXC3D3kq z5!4l&2@X7#Zgyn5X1Q=;L0~ds3VviFPQxUTvh;h8%Xa!cV|AoI38t07MM(ix6~o(@ zq91Sy-tn%Bv-(U9aK}fblV2+NiIzwB)PvCj)xfXKy2>{Xse_}GiJEqp4oebk4$JJy zDY!^h)(-)1lZA};n?SESz8-5)N#FX}_{|ml7b{N}c9?$SS^5Rh$>Q_u_8aX_*Sl?y zGWFtxr^iu$TdiR{7QuHdJ^Ia}bX&S&a& zHD`ZgqThDF0jg8S;@SabgL09bOyJ8f_H6{Z^d>u#5a;X{Qn!>Hr<%W|Zyn1T`bDtk z3q*W*_|1(VAzkq}S~l2bo&0AM_7$Dw8^a>UXg!qJ6yCQof|Y%voBSQHfHR9WiRq+@ z=)anNtF8=MXb1O_Y%3%2P#9n6&E&DN^m59f;al)zS8+{u*m8E@opD8K(=d3^D&lVh zKI?n9P%lnByhh=sr2|k9#IC{A>lUgMldWz&^GILmz&4Q6L~VN*_-)kbbn07As(xwK zXC@UYjDEzw$icV&AbzQaOwKj(|9Va*G1Ha@@BJm7{+~o>Nh)=Ea^n$>;bmOs2=olX z_|x@3zXW@|5~SsHRv$meIg{1JE&|&jI?w_ON?DIU~D-skkhx$RYZn=}`+eaR~Bg7eB^7 zr8l<=1U}0Xy!AJHc*_hfY{vPDVE=`54+ayd5qZzYSGy2o4=Ea?gq059w_;gBpO1)6 zXmRLHU$R9$8&&HyJbX0KRx;=t@SZua-*ZYktuM|KKIf$C2){lgmwXR$1!XK#kdEF$ zTzdhQ{cBm^lh6Dz`ud%i320>#f_AL$ZOhMnM`6t___RDH?^;0}oPyhYb;pUFtf;ZE zAYK?>gU<0V{I{4m-vi*tJ;~F)FwSn|RS4NV3dZw|_qvS4*?vXe;jC*yIH8{ z&{^Qr%%xNTLwYmYk&Z~6h+fU)Bgm>?AU%(qy1_36!K&joO~k|427azUThxGw4dj|R zWH57%Z}FBqEODTw@yTUrFc-W(Kt&oBOkw8aJnJ&YXVA_5S#XB31M6%>>G_qzjn2-KCHL2SB0RifI4VU$^3Zv~%c85+3JglfbVfoL z)N`)hz~=fHK@++YYi)nOk3238`c0{;)2GZClIc4zG4RN z6nTxWdYp3>;r~BL+ZRn$oW8;ev?ZKhcev~9)O?uhCts7;Kg((L);83aM@y9h&2ORX zyTQIg(R3l*pTe-l`SkvtW$@{F6V7>S&9q5R3+qcqu4h%PuT~ERX*D0}wC)db zFiqIXPo+2MVPwmxMirQ+`rBuM_ieC8Wa%~V{5j`qzJXqFEL7V+aGN211l7C>{C7OF zpu9T;<`jc2dvWe&FOF#{I$@{%bzI@nWbY{J=HY1Q`(AR4j&N(%F9Ya2nyK9ZOqEoo z``-t@`!fE)18}hD|2^rCcmmnr-1V3}_)ahE8B-vRO0|GVoP*Tv6~y@hzmHRBJ9sK4 zLu4^e)tV=YF6;T}EwS01Zcj&i+7vd98c>iYn2dA0LTaLP{tcbALv1Vk@VNaNk{(`p z0QUAp@A!h2H^}BoM=I@ahGg)Yc>cP!9LD(0pYgkybWIRkg#FfmL7t`_obuVh;2Qod zRc|Q073CaqTIS4_GjY+}HV6OdUf;muhw3@bV-&<+ONZzAib=OIcoiFcE6#<{li{k3 zeWaim^P$O@B`;t@txn+J6LB>!nt2U#f3r0ye6l5Hi5hawZUpS!`m?Zmb)0mR0 z%lvRP`b_)jx}>DeJixvBW<^{F*Vb($5+gH@c9WAAhj<%C7A9B@Q_05Rv`(XApO#Z8 zrSzqB05AUIR6sus&-bT-ePqDn`ImKmU@1VaUwj9Rjbl-Qj$ARVOII(M7Dhep;tfTk z_|q{qo0)(W^qXhc2P#DtT+fBPYqK?uQ&{}woN(Hgcq}(yl3RR)kXA%YZq}I8K8ZEEZ=-0V4Y297YD(ZH9Yt}t!OIoqss zVv|`{rsm$@hMlKlJj!^}A2SZ4aDFnP>+gZA+0fc6!Q8&g7KTnHZKc)@0CnGi2b-v6 zJ5f{0dwJ^7N9sx!`Z)dQ-8h%w!H9uyhD~tu-8g1rU`CzrRi86oRaYWddT=`}&iG^; z$P@hUG<5%GqgkHdtjFOBYwQb-ji+PrhLgW9eMcsnm*XzMt@Oy35~zZtZ%`awReV}Tyx^hLgq z`k={eKZ#ST39Oh;=8K_bAHwi1GSfYmiqy+z$8~Cs0t?3+(H%Hh?I50=_aC{&I;v7Z zIugl2nZ3R~sv|a?@yxsfY6~kmAV?lk0PQs|@IePSmm?$M`E#(PyHrYr_>4$zlO z%r}OaZ-$jD(ONL>Vb%k+UKGUZ4Q{o;nR@0o2X%aaBKmC6>0jL-8t)KyuLAld)*>j$ z?>L`VCkMrGTspu)J!cF*Q`6q~igf;t`qN-Uw-93uo1@##=o(mU1a$fUIOYs1W6^x* zne4xCe@gph+J_x^X2kD8)cE1&@tb&784NvYpEH59^DJRgsOQ?~GaF_&k7_)IcO>P~)_7=N zIrA|e)aOlhI2I|H0G-dAeo>r@72NV)1S@@6yXjxjp*W3ybC`UbjbjrX)ELI8 zEAKzCKWpuA$YEme1v(-sQG3>I*c7;FHo85#gL}SXq*akhfKp|A0bf}kGwF2>XP_#a zDhztChffQ8IN%R}-*1?HtAdC9m^T1qrz?Mj`RLVT?^`BJD&wpk;Y|jAGFS14Xig3i zenH8cMr(c6clZE#n2ITgV>-a?!}r<+PRxQ+amJdN)n$0UA)FYQiQBL?)ORAfy6Daz z1x$8|vKW8xcAx;f5r2TABc{IE#Ww2H*S61uketTcQejP4B*lhHHuDCZJJ z;C5}XpFv_jk3Mh-`c3s%rQ!I+A9>?Od!|zAaFY22Yx@bOuon9D9up03c<;(})^RRV zy6c%ruf>E-BD73o)}W}HBwguV6z9CqJZ7p7%2&<-%)w#az(n>BYU%~fe;v2)dX@8C zTbTzsNnTUEVRuFGYR38y?y)u8@J}*h4)t_7l?aWGl6b5yeRbxpclts&>W0>s#k2px zq{Jm(pGk?6tW^X*o_oIJJK8y4)lUf8gq-KiRoyt1HYp?v(*-e^(Adm`#GH_Iew!bU z*S9w0228m(Rprm%28uI3y~-jw)ITN@>RIiOHg*o}^`Bo!pDVp@Ml9F2Q$cCV>GxTq zU@D3_501}jyrBEcDbx(A>9(MeZwi|`!~Nqs(($T^Zs_*^&UOIn;vFCOi+4~ceegV! zGda_ncdi-pDP_px$wcKSPIcEH*EvNBS6&2vzr|GJZss_?(E}LFd#xYiQI%u;LuaiA zab`T3JLH}*-x&u!mkQtNI~lZ7@3NQ6dFK9TqLCUN9=H$eDn>-CawnOFzr=QDhbO^zvr%1RdVv*5~JU9|!l~tW~TlQ@x{YXUMwXbEK23 z)gu(_D8Gm-or|(K6u z`Z%m_Me5Ws@E|sChU-Q@pdN3^d8;+td8SsLp(HBUZk&}#aD#|&uMc#3^24_#vZGi0 zSIbPr{zU!VK##fryS;(FTdL4maNZ>JP*X5LP!jdm4%Lx>C~pXhOci>LLPrH9Y){Z9 zXzeQpucBlN@K1eLUlzBpI5?XwsNl!?HK?v$_9yw;JV=9@+Zhbjy1s2l1D`DDitn;A zpcyz*gmPsjzoF}O}u%IfdKCkF)Lp9J}A3Nr)^&_H=Zm{$)f zhKvd-hupU{!RtsrLyp;PyXJrQ$C-GV$GSfTi?b6+U3?Pn$*~L|KqD&{q{a7Ig_5R% z!!wxox6b$of7zT!o9QxaupLaxALk7T8TtDrcnUXJ&(XX;X^hRsf#`@IJr0%cne$D; zcbDaT&}&%9@wN;Gw1H{qY3Qk{;OsYd3MY9EXpoI=K_xJDKb`HfoY_d=%HhbS<0Q~b zGQK+}1XjRu$50KX!R;yr;e2ho#7y9L%ZIZ(+>%jUx5HXL(bEh4e*qXQje|Vkc`Ld; zgZa+!%nhdC$~|Cm2RI}AkWNrJ-UZ(|Sk6p|(ZT*`h3%BA4~9j_sbfO!@ovVSKDRFz zvY2xkTYdMCWLAb6Q^^naYxP@5IR>ScQlmH1r|RcpM;aITfL;uS1;68;7Q*2l4C?K$ zg6NCsw%FdWUh~ChnRBhCk_2TFee(<&toO=hW}+wWGrsYb$Zun(VT;A7+k6Z z`n#~a<32j!DR!h6a~9sU2{&OHPG&sL*7rka?9#jLFI~!{%N8cBhVWkg$9Vj`(Vk1- z{N?CwHHM>pVFtE~TcTB|ekZ8;Y1~iEgmx&vn?%l`<*raKhtjW_gGO#cr>Qefv57N$ zn|Z&9z+tzcLO)mF9`AB?0&F6hy@~i@Z0gV!vqJwo4jNsmxD*^Oq^EaSgSX4|4 z?)fY85Pjhm^XU&ChOxc2PIU2#@P@m4zL{?jJcq+NUmU)^!^b1$@6ZSO?C%6M{WTO+ z^+>5gTKG%Uw{?;Ae;l0!bW}+ehOy~>CGT~2lI|!m5y&CEwNp4t=+H?-9MNb?N z@6l3LqI|8vFSM9i+Ce<0rX7V>c%oX#a<;cHzEffT`-7-6$eQr>8$mlu=`e2?>5Yys zJEy7GJ>lP~s*(7p|Dz*mPOr7lwvQd&88y2lo@Wmpw~ovdV$vHkm}ip-urufBCNA46 zBsR|B8`?ux`$cp^Z~X`otjQBBLgnc$y2EtVWGxrLBlC~MF(ikeH4YK=ZFg}ZR^_u? zfmPit+SqT=%}2tcl*LI@iZz{{PxhFvavr_$i;93pf6t%2uEOD{+K4jZkUna>6uvsS z(rT9+ZcNv+=n%FV)8PuL@_n6j`X}M4j_6dfj-DZI8Xt6o8m2R-v1+uwPp9C~TAV~@ zUoNh3|I1OMpBm3+D+op_MO|14z8uIY{jcy*+Q=buipA`#p0W`8_YC+l)Ho?(U@URm z$hpP|kX2LoqGcfZ=U|$-^x_%t7tVrVDnS~rJf5}lsCnMA?jw$eUUUQtaBSbE7m)Ol zd2Lf*OMc?TxI?FK50+{wXa8UCtS5Y&i@|_tsAJJop;nynGf-~_gZE;M1aySsJgKRq z`y;?V&GAdTg+oa$Zc4l8gOlhUHT)Cnx(fSo1-R=vOi(S@_=EDg8pP>$Q)R=k8A&CI z;&0qXscUEaRrzE-SsLy?FFvRga;U?t*7I!t!=L$7jHW(}rr-KW>Uyl`VgWzz8urypqcv>bY!rg~^aU2^K~w+6QW+PacmIV`NoCI`WAIP< zl1^y>S2YhG_HBGsX~>S3;pBQpLhh$+G&uzycsmac?FYQu*SH^>%e_>nvT$2ZnS?a} zJ}f_cX&sb|R-BwQ*zFAV@_N(kv z-RtrK-l^NLLl@*Ld0QulC03xkfnRT(HtCSEFxBioZGq8d%OE)qB(xiM{vZ8K<&m%n zDyL|wGw8x96J5bi5`zWQ1^G~JraSox_umwTz(uaTwVX?3vB{laP04LZ=Q&|Jp@QUM z?QtIutaCk(-%EjBAcM)}zT-O`r!S~4`jAS=f~R5tYHS4@QyNv|37MP5AlYaplzzao z=FghmE{fvbX^1xP$hHk6@RJD)_n9^P6(*z-Oo>U|ZEKs%THHWS*&bYb1|(IHj_F^N zsHs%IMEHx`s3rsGE0$8VV{nd)H5O?PO2vLOjuPO7g)o-iaX}4((YVCC$qU9*6$gWU z3%o<=Gpib<((ArzDtqvNu1`OF zP>&(e+guKT-pZ`q%B|+J^Ly)LV2RD}*2mOuIuAP&hz9c&Lf~bqfQ|3LUi>FUt0G{d zP4r1Y|7V)-;^659@3V^B{B)UzmAgXNMP?E*pU~xY8Q$4k6?kGd(B2NhT;sRosU0yA zm{Z|Nm%d(Wt;V){AA8RK&H;){^`xFVX?aXO*$T)@WJmvqhl{3?+-)0g;UAzA^`nlQ(fsdU*hEF1H+=*kj(p70!ORCZ3&}ZrcIY zc8f#ml-S4q$_>)UjLy=`{sm6`7VKY5*;xGKT-(Rrsw3l!eR3RH!D$d(M^V`Lt*c0f zI;s4%M_rNKt(G#ASTDoOfv|)-bf|8lwwAO#+Q$Fhjl5RJQull7*z-RNqm@SqtmEi`}AR4rjlKXrX!F(~{1*K=W zL2eE=SRx$lai(6Kqh?-1C3=TveGIj)8SBgs^cae>EInP)Me!7O(E|4P6;5;JfU&-l z)AJ{wNQE$|xHt~mv}mWX{CX32Ko_R=JT_8+XXl`b&odhEr>~Lu`GBt~6;7|$=oeY( zMw2n|!UqPCL@c;vD}Jq5`5s+-C{N@x+=w6N>Rft(>FDb&{%IVT#`J0(FqxNd+jUSK z%!2Bv9?ss&BwoX|Mxm+(iq>keO0vJ@8Fi)m8m-sLZSsUnsUmSyWKovdB7)^(GlO0( z*U24fi_A@}&ZBq8%BrUPs_Mw4u<8#<)0|N$;q-+47&ySI;ja{hR9Q6hfpQFNSz+|w z_aK}wd<7;GpKqxf;KV{?8t3E1UJK(fni~DfJ28$dcYFJC>egR+vSYHda>5N1KyRGL zG?j92Rqx6AB!TZ&)5As3IlVyRON|DAX9N{=3H`tfnA76qE@q%Zb;Tjofa#SxLBY`~ znC#bV`lT+0gAP5G$~2Y}?FHIs1)MZVbT5(o^BVTj1Q_dZRz($fzsszPDP*kjiBqh} zk|;A%@HYmCcRE9K``n({s!d3s!OLcAiR5Al!?WHFEQGGb)-pOEfR9%wGNK}tPWB)_Y-Z~>znm(AX!4BzQ1YAIapIdxz408ezoE4NDRW2e*=l~iw8 zOO>E&twY9hraUj#3jwCOWA7*1aO$+7n${7|Q8H(dA)5qNwV`VtG~&g2*re&~=Ero2 zDMSY{182Bxmzc0a7H_?dyLBF~Ln{6_q;uwneV^GF9*6c?ZNNx?` z*Ylu@uM~02@!5=q(;20<9o~kYA`Wh<4PDegnGJ{8Wf0*x zu%ioRa26HrFg}~J;KPQfKt1e>X&A|!Yi___taVW+H9+RSo7cphtt$*y=sB~C>S(!M%R@cNL&A9 z+Cm`wxLp-9GN=L44Ih{Zt!fa=EcX_`eqBd(d&0hol~JT|N}wMs^Mq=qiwBt zwlBzN%|YFZ!JDZ>9`qAt>G4#v;ltR#??sBVJSPKJ$~@GkXJGD75+M1>d|pR2cyE-K z88{6mvnJ2-nK$CA$q0)u(a@r^jHlyojGJT+&XU|>9N2Kbyk)!vC-#w7b!yJxkL>Kc zGM&mQdcp5KMeX~J;x$n9M;m!2v#?Gt%IfA`{aP)wN~s$9k**_unT>QAv$9H%%jp;P z(qDa*r_2qysQ$>C9EE0oMl2@_^qkpa>+w)5;cF!_XH2Utpm(}Y*<80}2JBV1lZl|8 zTJ#EC!2`7IU~GUt$= zc%DmC9B9)fmg^%rM$SW%{#PA?kq=R2V4_ot80|vc>nq2oA9#-f#87#|tfAay3A3U~ z4Z3ZoOXx;ws2ZbsTVG_HiZGj+Wz5++KREfZQA9q|gXz@j@%|Qx-XhpY5-ngK&dSGl zM0zq^b33ZRLb#)i_|0}3E9EvS=v!F%TA;#UF;V2jAD<|%8|`?icAkAC(+SCMdo#i4 z!ELyeXg3osui;q?g(<0yckDS+-H%g4_Tsvj1ux}CDnP)${ zJkxFYNRQJ?@b{)w71S(x-S^|knn8#m8Dvk=cQrP)+nH!hn8^k8d=94ii)vF1b>j9$CX?5CsXJUgPpZsi=sn~7U+ z1^$j|^x@leGH%w0r!H>iY=|MxTtak%3t9#XFaT9!2>Z7$)%KK83KUiXwy6N0GY;&( z3HJUln9aqi-Uk2OQ*i4W=xYqh`v}e}e{QQ-$Nd>QnNg|WsTIkrMd*j=sipLKyr=HW z?7GR*S759i_~j?_1TAh2I0}wUKBv0CZW^i@xs&(vKtPOURnmTgJ?KLv3Vr5`nz!nhag z=4bE4M5oi}IDs%>F;v$#OcZzy6VM)~Kwj?@F>-AOU>9G*JLF@(cSKK}Z`)08dy9%% zmSj^XnS=`D>|DwPdU{4zA0lScDOBY2uVD|P56prt_es=7HwaSAsf5dQZJA0fl^MZ6 zTXaS}&q~l5r(kB)Mh!+8S-|reqoV0Mi}7@l)COFa`>hn_ZI#7}u^!2C=3-e&RW|dg zfAw~AwrXwdw}wdv{;50KpX_B%k)N*rK3HU@EM~k?9dK+HPzL^rUg#3V6;T|xTO;L0wOG|Wmm zHjv4tJ9*b@;17RsT6KauD2yK1f=aswy=fGPDVprGFBzreeAburzEo9-Pf-n}*7lS! z%Ap_V6RMDGAlAw!DDjCZPH0(H-&L2?LeAdKRwcd4C~fw@;X^(`*5>(~5&qT@ZCCfr z!g7KPHm|7X=2feJKII57kC}bVYHFf9#Lu}#w=&*>Gv}yIq}EsBD)659o#32XHTJdA@=wFF48C%k+%PK9G=fq777E8)`_ zFIw|=Jvh4t($^g3p1rSV+YOl;@)cG!H~npTyQ0plgyq@;CaVLB)Di5Sk8|uYPr4Lu zPQrL?z@N|vIP`QbfdPaLX=M)(IE-E(84T&No9h0GgWrR#_x^h+7xQM)NA zPReDfh;FazTP+>E$fiuu<;^S(hq_?7eJ`0A99JCut%|ypUTr!#0XZFYAW=k}~Z)M)Q5QSDJAztAk@u@KF#Ig`7V+1{cJG_pMtUD0Qz z;L!L1D>xs-`>(w!sCOB9_Evb3-71EeLE}U`8s=vE1UXII#c5cJyQGW-a8N#P`erSHY6EU0%=+v~~6D!&R*iE_5=0*s!1EE^a}HvUM*j%Hu^h?M<4PB#duaLtq`+{+0Z=X%x#6}UXE&})2gS}nOSrS z9Uy->vZ-^{W`z!+(yI2dCws3Hmrl4_F?5 zR5)G1HPM!*I2A3m1!~_=;}!X@K#_vV-h`~xM|70UylqR|r8^v^=gOD5smP)?;S&qM z|1v{-76oKEkw{%|;R`sZF6cUHp9(i!a+wa&QRZkBt=pTk=v)_*H7KkPTMf-?Gr@$)w zZH;iH{lQrO^h|$iHfcvF$k8g8VI_tKz$&t@_Kwnag^%N`4 z%!Gow0%mm{r`C9oS~sITe&Yi4D&KJWEz%Bp?Jy&hb>J2Yc%oBqA8bJtE<<%_h{wMo ztL8ACL*}591Zs{hSW=`^mqk9=8MTunJDK6`IL))u6BL1I8BXeOKK|eCAfw#eP=AXa z_Ll99v5#IZCw$Hkqnwz=In)Yunj4ki^A_O!s>xZOg-lf&kXH}c1r$@o;6y*L6M@cJlLi=}AISLx$zbduksFZHDY=TLzB zpz?D9XEN`rb7DK^)F1K3OsoHxLF%R&FVpKNM+ZGo|8dMPvpVXy{2k9c*W5ik{=V0J z@A|p?!knk9n@+cLfh*q3O0RH8hm+}wwE`TwRAVYrUv$X23QxD}EW>eFWCTN)G71%I zCHs36J$@4WP4B8akh=~qWhPqHVn0!n~sOQ8LAL0>t|IrJ4>Z?5s{Mx9!xwd$IIy0tlt_b|yEXI9bsRUb80?zW^E52jk@ z^VN5f^Pw}Nr-l1ZUaHJQ* z)D`bE5>E8n>aD6FzQNq=G}_?nXveQv(As~HU)n_n@Iefwj!hHcs)+1iaJwif;$@W7 z%V2fQIbot8v_hY*!O4|JG@@!2v@t!{egs|WHM=||UDg!#eP6O!PO|IXd%cI!%_pZe z*Fg;!0(Sj?0=|*mGgTy@OEl%&p9fR;8on_t=im@yF}1!k*`V*@%>TXaYm|?CLf-Hw z3U>&a#blA7$dSMxFmY1(i_T0vTE(wD@bY968{nMTS+EyZO@CPDMrK{>gtF7suES~3 zQM=R+Rncl~PBDv`>mA>mc^t!B&HSo5y7?Usiud2=Hz=fbRCq+XsOYFg5koxr-1&Xi zdFnWC`ek z--shQ4UVHn?6rGLgPDP{y%R^! zP=oE8;QuSxcA|4#L^(sLAyu`BPBQ?F`6qmI4H?GsNz0TcyVq~Y8qS9nd=u%f zr5z4ePphUgjaA82$Jb?za}V^34Xou~I=GJi{ow1V$3+Z@9-sAa?9AAY*?Xip5;($l zL{KvSfj*giM>%g#7!n2_dR02bO z;u$u>p}h@`JzPYJSM2vE^rqiYn6A)U<)yb_{s+#+f#@U?>CCuCm+4&>nY(z29q&O| z3I_-M;y%zhoHg9eXn%$_&=@9QkF75%_%AeSBU9E2!4cVUDgPDOjTg9eBBUFsIX`BY{ zKlLj6@|29R{?j+~9u+TFnN4(eYpj*m>S2EODdueA+d%(uD%WUdlFuoZ$0x!+uWx^M z1K$FH0|M8D<&0<&mODHt>TF!;qTxkz#(l_?D>QpxZ@(XbZv(yuPICA5spWd-@VG8J z54w6gGO8r=hbk(^szAB$|LjX2I{TtVNqIqyk}X&(^-0M|6$sbeOgeI{h$+wd4duLmp`OaZ}iS9+dGeg#f)`>8~-$cY^{x|w`#@PJd z^M5Jo7aNyuTT~7A%7FKQWrD|get9bU4|c`)9&(j*PVvcUU2*nu9CKvS**L}8s=n$M zH$Ej-zeNY;u)M=@-%)0yPi$;IDNm|6)D`b-gnv~tG~9vWhd7VM$epn`pSVL2PI0__ zFEw!~{(_M>QoYFZHyu=c&aG429h8ZgfV-J3b`&iT*eNneyqq~|4RpmFDatXCp4U&D;6tjgHZ1pt9IJP^6ItDv$xT^cy@)>GH`ANS( z*Kfb={%ze&of%yr{?&tegw#)6Fw&LgQ=|yDMO8~16Z0dND)OYz?wrkIdxtOZZy!)G zpucCQUnft3-zWE4*LinI-?lDaXF=y-*KEDYQjSuxl{_c?jbAEU9+Ej73+S}D&sgP@ zsptXA>2)ad;YJV93h#YG5Lj)x<&&_W;WDktj2`gK_ypec<7~QNq{FE{l+LLziohxK z*J*eG?S==3U}4znP2^F0m|--A^;CjfRRlM_TqZX-0rt8slUE|BF(Y7nv*9ECik3f^ z6ixxWEMEWh5l+pH%o1oNo2$V*uZf`AGI)?4!DK&TLQ)C*!T1c+8uPwPq#7Ji*Lc4E zoW#pH$!3@{)pKVHebjoaD>~b`#`sq7|L$2Ec*wt5u-%=U2Fu8->EgqxMQ@C(n|@BZf3jFP@8oHeYh${*p>>0I2eu37?VcI1&UMVa)V;uS z$M1)0hwlo%80(x*VP|rERgEQw9fi{}6mGvF&I~8oYEkObWE-7jnDP%0SW^orGJy9{76S?V}F2V4<;BMigOs>vM7R8?_Ib*~q zTq+l&kDP+{rJc-1M?3@1WGdG6N>(Lz5g3!GI*mAKR>^j(-zfNoK$w7{RL;4mBQ=eu zvJW%6tMK(+p%}*CCD;MO%bYv7m1tuC*`^uRKs-FnBrXOu1z$yo%&DiVN9HV5N2RgO zIx}1STtU7w{RaeJ4xSTPGbDS!(%{?fdVWKK{e9Q^ZT1`E=jRUg4@iAE^kHaH=*2XD zB4>vcj<}J&NBX6CgLBQ#G9go~@VNmy0`GeU1ojG00jmSHxl%c2yDs~Ta&C0E9XT9} z%}7U8@c{m}i@JtmvLxB#3m~Yf;v(<=FYnn0g^+&AXs76V=y9i^3XK6xE@Eci6!gLO z_^s-ovdv-Q-5t820IG-Zu1ucdFxzF^Yux?GbY(ZQJJXP2KV+W{OL`UEDh(W0YBCt9 z+3%9BGt%(ojpb5xVfSsKzTC+C&3F;7GQvWP!#U9pEkA(gmzQ3kBn(74qYX^4_x6yF zbO?qf_rT}4U^Zk9)K(PF73ZS0l{zuvVDzL+ zEh36V&JGO=sv4Bhe@j53uRTEco^%_5?mHV}>%Z zPqX=@`x8+q0EyP=OR356EeAT%!-MKd64ZzM4PCyfxdomp6{OK zK^fhp0xAZ(L$U{-Nu8K_WALo79O1>n|BZ-`vPI9#)GgDi47;P7M&yW`6P+t!KxCsR zXK>1(qn_=47k!5K40idNHuJ01&Poz(K#D1)2j|DXoacSW`W``fd!ve~<7g83nD%m= z>{me;xZSvVCgXd008Xt*ja`J}d^Ww&7GpXo%SfXQb8I5vqw9g=N09t%NY>;tr_u~u zR^f21%kiuFGsk-l>dY)y(c@tF#a_3Sal`flU(5=WaqoP`Riq6n;8@Ip$E})JDOysa z%aOs1!hbkNY*+QsDOz%i-(eV+GGv*i8iVO;ei`poS|c7tHAn?hS104CDj>VbDUJZ= zb@Pv2rw%%o`Q-^37#1HjFs?UM0Na3Q^9A=U;8smdw>zHnuODZ44-|sgIDmVhD#mel<7cLf_~YVf zV9x||-jp7{jr|FjfcxahBW#7c9>q*_9rPs)oPxkaZL2Ho?@G|Ijo>!>ONU*Ka2Wav!xP2p-6n zTLD^&T71Gi>MiG89ucOis;zPX6DexQ=2klEnX{?2$+^`pm%B9 zbjF{t)e1H$nx%4ll^XG5i`UFNIm8qAE8waple4w%<~V6tI>Kyj2FWQRg}DvgG8V3- znGdF)S6+B$h!o-G ztycWMyZE8fVVsiCAC~dI3sL?{!y+^^@Y;)Z z-0idoFY-NfnHBigU-4C^<6M}CPw5+-Nmi==879SL70Jn7ji0N+M)&PE$a2O^Ov40+PNy9FTNw! z#|+scGKVe*-y9t4ZsG~{JMH-vxYPfl?}2~<0rdm&1w0Au9dIqOSVWqr#szfME6q1| z+1IsZn^|@1X3LWyE=agHcwU>od|kK?+L&GNv`*8-WpSLL&D9CI(zf~m{>4Z1tD~e{ zmJrEhd1IH(4O2ai6duwtG%5xK(L!M zA!lJ-xTgK+H#KB=H2F2WodJ03Z^67@N1@6ruFz{Y!11NY_|F%sL>OL)-1351K$cOn zWeZ0#tBY%sPd-m0XTzY+Nis2&yxcZC_kHnJ4Mmk~i7UIQk*KmU)k(_- z=yKo0AF5a?wGf6W7_HMy;$|(V=oDx8LVRXbZO7RC@0oj07>*_o7vOmGykPIGm?R?W zh!}8J9FFU|OlO#8ua0je2|oG|d`fy&BzQs=!1r}cERmt2AM+ukx3|JOnVRWHIbj0| zkypBlpS%S%po16$;#x26SXX3OnE#`y8;bu$dj9tyns^xF%c`CV(jn$O*HLGpYlSn& z9T~JIbYSM7tl5jt>S`ZTX3F8om4`KN-lyt{*zK7|My&D-3}_i>g}8%udLH;JaF6i2 zADGi;reAZPjR7KPb>IvCSCNY|t|)rHeWA(4=Uf^)u;Pa43a&B6T>B-1i!;3jh)s(QO8uuFT9OU~AQcvj+>C7XnU zrxCLa?vNdPN~SZI-p9^;#Zy>WHoT~B=+RrE%Vb0^jI(V71FYeupqJ!7F2f1*#n<-? zXWA`T>dZK*mvRdJA??%;w(BEvb+}87vr!uJWw`3cN-PNacrK&upGe*hgM<7cD#AwZ zB~Qo1Nz)^Ckh-W#4hQxX)oG5wd>>_~Xh%xb#5|*a=`YqWXCoiOzfsV*(772_7OYYB zVDlxzt4x`>D0+O(gjDg}ir>h(ByxE`snpl~k^+Xh8w8&6l=PhS&EnqeiSoVUe&82OeI3D`@*!UGU}IEQSPvhLh&XsBf2VP zHp6`GgCP;By!?g7a}h}E6llLUNyh5vJ5lW2T<95LE!P7qz?B}@unLqa0RUq zHdf9ckm5rlo;uu_el?r1({>!@bs6po?g1lJRg)R*k6`X>Od9Nuc7W0dqu-pH@w~S^ z&9H5TNqtC$F`ay4-zl5n>18fHOb-q(PNwGc3y*NUW`Xg3L6=pFeeXhv+lIC^1wQ(Q zcEkR6mi^=>e2`T|AM=c3ff;Rea738beT%xM`5ueNoi%y(xUyrL-Rk;s(9OXO8ihA3 zRijXzikTaS{|v6{?;EhnJ;?Jh=!yG^tC;JJ>!#H&266It2GC5o)p#fGRo6>+imkdAG zQtr2F4$A(AXOYk-9~iAJ+;lZu zN{OfqMd_a>z*CkWyY-0MEvl0gtOn=OLQGc7DMdqFgGMsjIEX5!=0)7YH&b*{xtwIrHiq*;AST=}jwWUeF_>=`#XL%HP#68NB z-_ylC$gjGmoTs+)sv&;-j za36N%auvjBcv4SN$4DdH=b23g!$i{)T{VuY@hYE4uZxnKeP?YQv`;KNX< z#S=VqmDsD{MkiSh-MKaT>SyM6rxO9n4!&Pvq!K1o;R+L%qWSkpa3wkMQ$(2^U*ccRh0U5$J|Md z%ZG^q(MBluM&?0h3_`hS#*`~xT;vHj5!#F3zC~FWdr)BtA=HCHhweL zE-g1|)TQpGLW^2pT*CRd(%33Y65cgo_<~_Y}?Y=HRjJuW*XxT z)aywi9Uh0(=$YF&H8;prC=3tbQIz)44b4evrrBOwrZlHJSLmLOkFO5$zzjE#tzHgnO`na>6GmW|2y6YQeO?GuP zbGiQblnH1Po+4NKY~Axr%;pL$7*^La-)F4)g`=XG{;VsKpGjhBY#=Isa&})aSoJ|F zk)JAw#D7iB-(Kn`E3YxSMPHEC4;bo`aP4d0ML)0}o~UvE?+b=-;+}==yMi6hg5fjnyKNxXF2e9f8 zu-h3J{pC!J%SgBIog``L#4t~vD#wj$2B1|-RgX?7(nX7!Tjz8eL4};8(>%62V zXBnU6Kv`QY#yizsO_FJFpxoCh^e0C{XJ&UMpZ$SLLmq~Fiyj?WKk8`aGMQpCmyeni z{?@;WZ}9--JmNTIo!5VLL7c$#94_;n_0bvVdSy-UIcuGAE%xc|x)AJ%*cUM-;%!KY zkUs%c9AnMNx)e42u$clE%4(H`Ov4D(mib*7aR*ey{k04A`UYokPWw5TLj{TBAeg-J z8ZMsvMqZf≪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 literal 0 HcmV?d00001 diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/0/4/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/0/4/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..30323cbd7695908f7f04ebd962a60ff59a291581 GIT binary patch literal 67048 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%0Ax2iEQGI)2r4nOL+}7R;h^*RO%;^90##tM8Jia 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 If6wp#0sccOpa1{> literal 0 HcmV?d00001 diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/1/1/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/1/1/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..27a96372dd0474a2a4d99da6bb7a29364db3611e GIT binary patch literal 67048 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

7l{? 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/1/2/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/1/2/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..df335f47e229528c1c872d395434702061b72fb7 GIT binary patch literal 67048 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

#XCY(Pg}0 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

r~DXeHUbL zki5$OcdA%p&(n3SmUWoz{*^1)@iNP9@|vmfZWc0nFWK5)U6waHKX<`H{Ska>wMjxZ zR#y)*d-QO#$cF7H^-9fB!@w{b(>Gjl+o(Eb1|Hvrfx6_7eB)l=u0G>suv^I{8{icQ zAQS)x#a-O z(ieWxD(?I7bdyI&Q7CS*q7Z9|X1$NPCJlP(IZWw)lb4c?bCQ?4xTw6TN;=!bOZg=` z8lF01oV)C0{@KZ^llksZ37$Crh0cV23jWSLHJhZI&S=lNF^9bcF*&Z+;`#4Fj!*@* z-cBZ+p^nVV7IN4$ok~n#V%z9kl%L}r`c_7BW{>OPC}=*pHmj*l{Ej(wLzUW=*I&{< zWw2|}D<3jSk7FZFNjDMqZ9qTq=G$#(L!n0<1b93cysi6#~INCkPx zb98a`ITe#BbzTtN7j}YaVh`G~ZfX)phMH^sAe!Ul=DPnUHP;?@yYjjJ)tz{&|8f&x zGT(!qWK|16i6`q_=+Gal$vDz4nJjj-xIoSNoqlnHJ6QFHudYj`dV5>P4%TTwF0z?_ zJhbXw zw7+2BkoOHr_$wqi&m!#DuivU$YNh-}%@glsSzH3!)aSCS8VLp{*s0SBZ{g>tyPhxs zR8=dOiD%3A;8F`rbM=9t9VW|~qT~#IWWsxIeqyukO0Nl;*m_pD z<4iwyCVt>Cwv?;gRWQU2+_WI2rFEh|%5Jm`nE<+?y*{nEabnacsr$~bD2p;cu@Z?^RmyWCur#*(U(rD z4LQ}LowcHinCjc(Tp}T4neUZ1HN4b6$xDl>voF~rWw}+}*)b^ApXy_>g>ED-lh*u# z^LthWIjh}BYdD~WuzQt6CzYR*+=Kf+o!m*rNJSl^yX$VKv(p(z4l{A4nd(4Slm-=M zQFB$}gHhMSLR6u{P!+xBMs2No+G41j*6N#PA=!D&?r8{$*&mCx9=uAY=EW`A#dF)g-kYxD8*Ryp?#@ zI-otz0w350UeN05@J2_~RQC9lMRl5$%^U%0&NXui6r!Iz%#?V;W@G}mB;RRc4#)+d zQ&LW2qHT*?@F`5aBhQcr^rzE9b`{2X?i6Acm@QKKwuxPA5U%1~@~^}Tkp%6-4LYI{ z`n*}kd%911Vyrf5ExmI?T|j(JogL$xV`F<1S-~^;3ICzkm`ks97N5sbRfV^rsG0yy z@&{=x^W}EF-AS%zh)9!}`pYGt4@4XI0H)`>i}>=6P@2hN?!yS`~oJgE1MMZ%WuqKYEuKRle)xN z%AgLy)o&nQLC`TK)o0xba zcit+R%KXk>I+Nb2$8fT?;()6M3%CIcOK}4=@Sa43O9e5n{O~4ZOg>80^YL<`qSKQ57_DH zc+6AsUfqL3N#^Dw1NH#96{+zVTqo`95c}$~=>oRD`xl>{ynxkb8xrhKM!vb6^rw%xnYOFvU_Ea**VEa*`pBHtq=DH1-2BbJvFg$fmPP$r zLC1sT4RGFqlYUMIaGs~xTQp^Bm=K>i4V@2xjp5|}h@0Ky$EnynP?$uR0VI@v4&M9? z4F40k5KTrmkDNh)`GzR5CjBni%InSV0s;i@%#=X}te-Eq1^^ z;Now(L)J(wQxzm-Fa2~E^bHr(6>4vUQ<+TPrh{b@0;uxmaIb@HA9RSf(d*{r(_GY* z>7etX)_SH^x#`(tUstWhjhF##adT2|gsp0`p}#L^yOLEA70e%KqVdVeS2D!y``Z2k zLY9^uWuASkYvAXpXo}*iJIiEOT@E!t_^MoRtu3jvC)Gn4qsQ8O@Ug4N0_&~&fvv~r zom8Vmq)WhhP$!m%F3xpQ!PYzXs7)>5s)vbezQfL5k&#@G>2j=d(^)KnOk24;8*F0R zyI0VYR`C8}5BClfhp9jS^P^QYsx%CDWA#!@le1NRXP-*cS7m7ugJ0re*(Aoxx8^?T zs^|I|_x3&c%)A6q>w!9HK1{)C{g}kJ%7z^Q=BiLhso{&7&7ufjT3>-D3W-o{HCH#2x*!Hxm}On9Xi#>!UV~$v2HDZXWn|$_eza z)4XExinqZ=IPF70`;LIzWW=9Lu7>(SSFmAb*z|Nq_v9wtno05*Q(y;J{Ee!-TF3O* zpL0~nCp{dyx>?(_Djo1Du2Kd_Zfx}x}l&io?|sr;rk zoxnEq#zm=?#of|=7r*{!=Hc-$F@tSSZ-c)?z;%n6;+D)BF9X`%Cf_HYxVhClIfNeIny#gmfE(4eh4BK_q%Td*Nv_6kGmFgVG&;^0^pSf+ zOVwNDL+jt4J|d_1O#UsZ=w7HNyF1sN3eJ5|K}7q`vOBb_v)6IBx!!tr0=4P>a_DX- z_C4>MJse1BSA#WWmLXN1&i9pgf+p)f(S!unb#Me*dCqy50=lr{DighFRXVRzbRPNS zd1pPnR0>IzFw@`*Kaxb$6W^yo$#fJaeJo5t6SG>Z(fM>?Q1;0vMf)-v4k8mmdG9%i zcl0RwNte&?J11(C$);QL9IwEJZq+@=dwOga;GCVK_rr2U{0GtUhr#@2ph}N6J3na+ z>8?D|sCJ?FObIHnN|JLR53BFgTGUR{(1+(kH*p#V%TP|>8B|d1s5is)F%b04REm-A z7ho$f+>?3r1v#JdHIPo=l>L+%nhW-5znCYVILDoL?6IgXia3{@Uv+D+Ku=T?y`7ZK zGiQYFBs!M%-fe#oFQ@(0&Q(9Tt3!wVD{Ucqo!@w4eiq-UZe%+D;T!%S&8ar|Gkdmv+L0w2%I*L5vI$Tg?_a6M$ zpL9}v+`qZcW`c<2bbkQ*ENHi>_3{jLage%A*RaBBI>--h2l$!xt`8(}Huq^mRONS> z9L}4s?WakogFB8*Qb){Le|kJe*WK6r>2CTP)7G9bG4g>rP6E$)Hq;&m5A6x|)swEU zmkIMGyRxzPMz*8xzf5m>9;Z(!QV|lU_bc>!s>BvE%bm-6_s;svF&K)>YN~iBkINU% zU3UIVP<2FW*`K#HC&>WmoL$aa-+SLQ$BGxuV(?YJe&f&Y4r2S$dUMcpvtt8|LLL3Z zz$uf-2r7hKqKGId3#yH>lM@o9l&5@7r~g;JEoD|eFY<~yeE09g6%P*Rac7EbFVKZU;K1 zS{jEJDB(nA@%A8FRm5HJn(b7w^RTCWxcPwo-dg>Wy9*ssM6E(ePy}aJFT6!ZjL%(! z8=(r@kiTYPIKw2ni(4+W`rRhc-@}}oQ=ReHKcbV(BR*x%Z)RKfWSg2!>Afk*C(j3G zJQaOFb9N_e1*`edLNsk5_{??4QtIZUfNB`p1WJcPgE`iECpr7ucvw@0# z32Rr`U)Vp`^mKcZ1ip)0q6K8Dr{o47tz*r%ynV~SdD74|ox+pzR8O%t`9ud{OR}MU zhyv^HLXtgc!DcR%_c#3`{dBC!XZNZi+yR}{ulg?Ns-SwSMF6iK>fy@)kS}%OQ@;T zflDYZo{1Hv0MDziw&DPexHo#Z=;hoJdDK`qhi_FUHodQt^+h&n*be5cF5o76#z)>6)JXSDsttK~gb z&-4fTz+CiRc$EyESNA!Iu0d}#O!H)L#0SneRhiwGBT;J3!29kaZ^gj{zniUXy+m7a zMXwh3L|Qe1YV3itZDIG;IIZXyJkp>(Q=X_P$FTXNwY$lA%+!|z6;@?iUnZzr=rhL4 ze^n#ixl>G9PgM)G%Il`4p~~n5cla}y$ULtB8BtZtNnHl+rJ~+%TER(P1XtTh{&qv# zT1~;WFkFlI@snWatdmX`fTGJ!;O588krk3?UBg=4;y3ZfGFhR zM(C-YnDtD|v%rKVnicF1ZJ`dbQ?NVrqL=vwox}h16qz8}(fuS*T4pD?Hm%d$*WEeg zyW&KA@5Gnl4<|2GAdhdKlfie$O+~JrOA35HZ<3qZ^Za$>S77AQ`N(AambYv@{nS}e zN^Fy1bXjkB&+|Gj@xWhG-RRZkn1k{${laXWm3>0HR9kYNiiq<3(c~nE~o^!)Y7^I_jC+*%UjgnpS1IS>evD0Q#(+mc-xF>BP zTM_0ZiMtP6?}n~xW|3G_8U@M|`i7s;d91?qxruLeCt2VFbO;7x7P`~_8KZ~jv#O8{ zQg3|fFpATPJnLufwP)by0a;MP2ZdXv8+iXYxyQhRNj^=do%i z=E8ZUm&Ki<;;NeI^riR8D??%*2``iAYi`5Ubyg450sbvT^#XZO|D~^+^l~$(RSMA% z-aN+EH0?o}Tf)7pRAF?)Yg7|+SH0sq*r`9Ew!4|wYje`Og2;E~4a*Gv+L|unj&1|; zk^+>d3{xnXaCm9b=#yr?nGDyI1e~#`ZDljS=4DY`=$>Yo8sLg`${AN9k$1@OMhcA*Laj>F32U_SdEt$Kd@(IW2?~W5qa7)i$Dx)0y72 zCR|HH-$*0eN;a4NjhnNLKdDKjld$n`F6lU*@~AuT_WlU|*@1rQgp*04J`tByc`EZw z=QC#!J?wt{xBN6&)aPloMP+b9tai?VwwGZ)QCBVL;u>*#W+dyim$=2fo{T4`xOLCz zI`k8(<$hINhs9%kSq@X5bdGc3I#Ma62dg!lwmN1yOh-GD368wDx%{bmqR7u9Ug(2V zzIN7gW7QN8%Y!Hp4K!eh$jwZi6tLlOQ ze~IcW26q3Q{h17a+UNlrqZIzvP7r%k2(NS-6ppbTT1I2(L}@vrq^QZ4PI=AX)=U{8;eA0enXL*_0oRGa2US45hO4;E9d=4L z(AoH&db%_88v3hI)Rrl*2|u_wbQX6y6BbGlcH8v=J)Qq)1DoD1*2=6*pHt;YbB&&5 zAs(UhbW|PbxV{ztYWxnO1as;E{erDE$;B$!RpnNtWoofNc69nWMa53%8JqqR#Y*30 zCzbEH^r2(j%9H&MRs( zRZIQScZnTBXUWFw1)E%y%_H|k1FFqe{OR*ji(Fz9TrA%!oz^(bHyzgtOeXiBTu*9a4R*}^XKI>$<}ZD~Zj^ng z%0=+x#n~jP7*FXj*|PQEa@kvm3a%+C&lYgspH%b?3Y0|noTs=I9ka(RC`OtW=DvKd z@u!+torAgUGrLX3(?^6+H0?!EKHK(}u+t#03RQYzrm1&y+ucb|@n9rw%g@w)(Ty|Q zjD9`4NaZB=9pm&YLthbeW{6fG0FQhjTVAQMPI3aSCxKjo{YX#stzw^w*nZ7995Z#D3jUOoH{?EpCAQ6;y{n z4p-xD?rXa+rB;&d=rfPd_jl%wISQ^^1{K;B?&>>WS3BKCrnjC9S9gTm0?T#>tY_a{0x=ZcC)|fqv!>@sTQ)FIt;GT6%=c& zTM0erUb@1&-26?c)Kz$*EyY3S51Ezwsgg|eUH4sg4mydxXHFi`!8zsZcdCl2JYmNf z?K{e*fbCu-x4yg1Ki!_hp?XCpcYB(S+*TjJEW%=r>_iu`$5az@<*)LH_}8?TMd|HA z>MphAE&b|Sw>o{xCMwoN5SL4;3(vM0p84O!|LE?JL~>{S<_rX#y^p5B&yLMiRHXLY zM}@e%HnY9+nTi$dWHmCgqNvlYRDM+)&OVOrcd1;+XZ`ULqKINFsp*8uVsz6^{G=jFW5&>BoV4@cjU{@<4ph_su?0J`S^HoN>POPFuLvK`4Uy`96{ZYy9W@%h2r1MO*xXy#$g2lVirHF7_LKw+4EG zKCFDCzKs_*Z3l+G~6{wvQ5ba&zvdXBI7xop=0OFCd3IZkX> zXVAt)<4T>WPn$M$K26kq)lTJvLw-d)*#nzb3!HKXvtSU7X*rO)ujvD>*xpR76RhO# zMmYQLjo&O5ugp5`yEZ0>Lg$>UqDGT_F^q114ZKP{HBATQ4%|=0WfQ#YS>!IAL9Uno zF_|7ESuL7pX`RCGAYl;=vXWh-1YH^Ar1bsG9=1}b*IS9czT>{ZUUm|n2bi7Uy=Bls zROA!3usLjHIPv=MqPdv<+kuK4kSjSoKY+UxVlM{i;`DkI!Ljnn)xxR;qM+;m6Zo~b z55js~Z4l>}2{v=Lo#l7B$=1kP&PZ9^d89gnMC_Hv$i}*ir)8#?BND*R&#T|y#M6o; z{G=7&mOsdNw>i&Xuv)KksxfkaY$G$F=Q?EONGZhUnNxlHNZ1-O|(#B&3f@n4HR$S z|F3{Foa4_&=*im4ROC!_As6W^wW71FM)p@zI?PFI2@Q$m&N}DQjrF(hn(r$3XcI?> zJ>X6)(OahT{S~a`{pRLna+wA`1B(b>yW5Nx=Wt2J(EY^7`|3OWLX1PXHIwPb-r@;k)JJ{h3LC#iDdA; zgJn(8g)XI@cua3{R7`O0%c0^S{qA=-1`6u@axTbeYjIC5*0*5Cn%F*SzTRraf<8SL z-BopF`qtXQQGF)gcy;A|nVWYjP9|49&t#Ry3!-1GO!mem`JIX7ZhpH=rk7JI{8FOncmqzC%KD0exh@qzIBFsS0D3M2M+QqbJ&WiG@oXi9%7$> z7eCX9a1#09YR~B9N|4s_N}QC{px6VBg8XwZ>`z_nr-bNv*2=Y}Hkq>1nGI5*zDh+G zRb8&5_8zpEKvJ%Y8>%Ns6??=HQIN$&$D|NxL<5k3IZkn^Yh~D`49+IsIp;8E_k?ek z@1(zgKOHK@5E$ZlQyC6t2k*vpR8FPbx#lvw{kL@H4RmkR@Bx^>%*rR>ruei6xMf$O zq3$StLTj~B{zS)Hn;WJo9co+o41L^X(SUT(F7V@PnQx=S2WO<1$lJF-_|#9r6$eEJ zaa10}ebhrvkpIG>fzyFNYTnNivbWoZyn`2fhbNSDJHqHsN00G}F5oSU(s;I>?G~^B zwze9~`>{kk!>?S;+|^n&7q|2ps&cGcO19ozn9)aQ@-M4Suxa?HnA~#7v}U{-?)Ik_ z&#r%iTkykMTqi|g1U2bz=BFCG32$@?omMVK*E9m08W*sf;T&-4(D7s!C)sS9*6}$Z zZs9B_*XBB3$W*>VzOB9`vZ?Qx+diJ=m*Ph%VfNB@H#5KJ!7!%Ts73cxDmh)Y zr!%P!dzMB{qAG6SKPz!=FO!pHKJJEgqAz>3`}1td!Em=g1L~r=0hL7E*V>r`deE63 z_8^n(M5hm0nwNAYyXj3|h{5D(G;!*K&z2E6nO91~Jo=cqTFX=>C4ALfO_K8ukKeLwhakjb+&G{8${PNH@> z>i-K5?QZ7D|4a^k-zoTxE^@Q3Fxfq;0%8Wge_>fe9uqg6KUF-_#;@!hy{)5A7fqCl zO@wab06f4*-avX!q{2R= zPu|KjHA)@jd#Z#&XQBHR#;Tqj1M?g~FO>^M_a@$_!?J?B3M*7!Wi~_TQm(7cbZG_k z19=w~F&(bepVc}vHr?6CFkfe)-*1GwaXp-MB72pKn=ZC6f1;!DRDZESUO=IeLZ`+{ zngSK%T<*+Vplk=JPp3Jpei#X#TWX_gG8{W_J$-zB4Cm4C?NW-U>4ku3|k-C7=0|)R$Mf4Xj*7Be+F&aTk5!$G)J( zCerU!<#V)w|10P0;P)5_UX@E8wq@0Drq9Omnp&>TOFwRe3w#ons^(A|@`^)FHD?#w z403U&eWNO=4!rX}pi^qWL_7h6eT`_yBs`1TVYPf?{!y`JsYf$Cz>ae2^eC{58+5&?NCJFH-^H#S9p-H!3EnKU?Ub;!P({oVWy})w zt7M0*I_%cPY4NL?tokzHlpx>dA&6fmSb{eonp^qjb!sC%l^wF7h|*0&H`z$EK(Frj zE;$879`3A-bOouoDZ;Qy6P#(>D@nnx?z>Gw&(JAtbGO+vbi}v3Tlv9K}?yfi~iAkprZrx%x~fs!keI&mYl4 zDYX^WJGmaqoxe!@O_s`5Q(C`qT8jg2548c`PhGM=D(Y|SarqjQD>)vEx?o#HIK{_R zHiODZZ{@AN!K5++L~)rL1a<8s{}O-7v3j|6=(T#uG+>wa(H-D=;r{%Cq%Yl}S|w4IZw4p|2{e8qlxKL~+(qR)T>| z%|!KxS@M{UrY~^pOSX9@WotuTnN-zqZpr*q*KeGN+)WC>e5Tf4WgTvSl2nH2q8gpm zcDaq|rLjIBb2HD32E)k-KhvB0^S$mbhKNOSu??Et%+aO11az;P)VFq^Y^a{78#0F) zK$_+Q+%oSa1GZg&W3{?ELK1aQe_&c#$hMk++!|Y8YrFGr{RXUm9SWxAdJOLmI!kcM z{Az=9S7cGOMQv(d3z*^~F#QMQRKAgssuq3~x+v#`vjN6BgHzSl+1WuIT?wxGhm(~` z_R#m1kfz7HcbOsygbw5M0-CpS7v=qq-@kf+4Md|T|cF`!#p)D`)INU4UXHn48jm@D?O zS?_mMSOn?gR*9*~E&xsrlE2)*lJ_+kV`rGJpPR~C={+X*u$Zj`l9|taj$PGeO@=&3jf-5a)cYwfgGYgSGo#mn3GX}EW+h});;9@NEN-z#*C>Vw`!}}s}iW- zw#rX_g}d^ts%U?*?Q{uISnh)z>?V?OVz1*U`-ZgAw5XFd;FU?ubQ^;@B?e^dBD&o- zVBe2qYx$S_lY2G9Jv55Du(O(Da;wECxt{S3&I4B~D`WZdC+S^!@ZRrN!*n}%hJJdz zilDadtINAN!DR#~I|Jla&T9+)ZXI%a9s0y&=sh(jWG_|hnb`&s`v;wB9hjPloX+)P zhW>^A_-i;5rK&mq%H<-5=q*1Ji{Ym;IjgA!U7Qr~fPZp_J#yChj);)&gKxUC0@UT6 zZwkty^IkIaPY+Robuh2Jh?~znE#KRK41o@hGUd1>ikghv?rmV5Tg$mBH@IIe)rPri z2Yka|k*Ki3|pckCVw6mB*_wnMnAn8r_ zch2A<*u}K4R#t|EpGQBuo-?BN2X~@G;s)0Ig`XGiAtEFIo5~9 zpZxRwe!p{`=lgsw&s(FD%tM_?o~cRvbavP>lVLVWy;;v`tj6J2CJULcV(no1=Sb%D zS{Y)u+B;sRES3bc^I-5%H@)0+B-hmn?H~eYT!9-Rxzv*u*Dn2shf&|B+8d2?ha^{oYHV;}0! zF&l15V2`&*E^26|Le177YH|x8|RTibC=NhwA6w0^8V)wu9;ul5|Gm$vJNHVF6gyd zmb!=RDLl)4sH>s;o|$+Wqj32bk`fRp(#O~YJXvnj6;^^bwt-`MHlJT+@6JxTv&eZ4 z4k!g_uU6qYg}+tK6P>C?`^$ZEeO-K!-eS0}7@LeA;3qf3-sha%;ZwdK33kql#+TL& zwI$fAGP9(RGcw0KH#5{@oyNYb4id^Q{J9k3d+jB!aoRk+1CPpMdjXy4OK+5YZVyPY zJ`2X#gX^m$6V5F9*-TkuzlB#V0-gPB*7HW=c;=*|-Vpp@9o2b>;O>9O%}4^r%&i6@16r=eEk_>u*!^>p@cdT`J(wE`I(%sfFh&ubTm)@-4n8DoVdCW$a!K}+T z&7n3&Rqd1gkAqZ4>vbp<4&7?=7@~<@C~DBt^mbU!pX#2_Il!iJcY`% zOI>q{@TVL{`FFtJ->Em%L8nHgt7zx2vs+~|70lLw0crk8zDD;i?^DTw1DoiU`yTlc z%xyY#A-`2TeCb13!A^owGsbO1h1$YA`3N-G=w`#fCCEB6U)8`7EI|G5txro9+)@|Q zT0OQC>=E34l_msa80YKC?G2$<^k)a(NDxFDZ!Z|&q}GMqe)C)IT$~V8R!o{hcu1``+gE1TpK@N(<8T z;gjU0uWxeICS>%Ng83Qtq78n%}`(ym^+%u>}6851MK`^&|xj zDi@tH2o^0B&G-^EXe!>69_pexj-#Rj%IbJk;T%M12Ubg*hu*P4t!ol(Sd9 z7jLFdrrIy}7V_qXx&G0(3s%W>vT7GB+w4sun#(weLp6H|#Ip!?X`Y_19yDj`jOM-< z!^uXO3^tSZhj*&gfo8M0s_MZ8*X>4kl5Jy?$^CSsa~H};5c_%gh`Kn^tkrwz1UYaX z4SELi;v)&O|LUjs4fg4`V6{fr5bo3=oVOR4CswMX;GbB01zD!AF4j!wW+*O#UZgo{ zY>o|sVT&+VL4e7|(q)(7s<{F8+Q0_yIz0(|G28nJNB#h^w=tw$CzwjOnkjCW`B+l* z8PvElGD04352xE{xKtxhUJk=@w$(ROqZqwYT|i68bLvP|>~peFJJvhL$y&tWuXv%h zs}vOodpFIgcI&-%Z8n&28_PQz5)JRS@(1GEc?E|>pw6K4=TnC)PtkcUMu1)O*?l`%zd?^4Wlrd}dY6s#2AN{A1qZyARLApR z%CVBmL=$F~Xv;nC%~|?{9i{uFk8akw%d`ShSlNs!-k=M3b7X_=4o=vHO8cjL##5{@ zLHJtgL8+H;Q6#|Gd$5`LRHsl>++jFh;h>pL-bEh^LCyIU9b<;+3|bmP24uhNrbgz0 z&aT*J+@`ZA=;PfSy;@S4r`Et91nY+;5k&f%o(U>B#~p8v@8MmYsNd7?IR7{$uqwe! X39pi3OMzYKsVd|MUduFnMGg25U3J4C literal 0 HcmV?d00001 diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/1/3/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/1/3/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..2aed960ccd4f46689c92a9674828e84802caf810 GIT binary patch literal 67048 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 DFS)Gj literal 0 HcmV?d00001 diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/1/4/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small.ome.zarr/0/0/1/1/4/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..9d55edc0fed13399d51878a9bda49714b3b74f72 GIT binary patch literal 67048 zcmW(-1DGAj77lNnbE>NQV&)Dqv2EM7ZQHiFNjCPxwryu)I~!XYn71vHv&sq2(d zJ)?iAj!NYDr9#wuO093Hy_A4r(P2uXwsT*}L$j$NP3FnejXF?FI>OD>BbrBL)k#i3 zJ9wwg#ii)8+>^qzK|az%6-{l`0a-4qJ#VQnHBq0qB$tw=lD2Y~msk8cz%9C{5%=+*2pu;+&cbb0?ibCzE9ygHP#Hl!314pR|*cad{DY zKn_S2DXvSI8vI1x;@YOHd1-Qa!@Q~7Z*ERA!hgg2)t|^88tfSUBC1G&=%_6zE!9>_ zR7cNWWIQ`mXX>jSsrKq2*V9S3B(>(bDvKJA>q?-GsWoadRim^#g2t(TxToq$xl}>* zidv}8{6npwmsFP8@jW?6F(?H`@G3l~VH}$d(iR!Vm1rjAkR3EeBI%my&1vYnTEf$4 zG*{$w{D3P^Bv!k$cvMX_iT9~*JfBLjUsYEXR1Wo7ouq{7Fols{vb&Up|_+SiP(!lR0FH>y%PTW=b!fq=(CL{Z$vWw{#{`iF@)78Eahp>yu`()5bpZ zHgZpSGlj(VMf>}OZT9DkY7liaUcm$#)lM#?+Npokc$HXHq$#SNjKexFQkhg!wNrKV zyih6W0xe@dYNIM;;n5Vyw@`WU)CW~W?NCi=FIM=xI?JTy^8sF>4y)tw(?*(!0Bk6TFr}ThB~K;QX9(8nbl}&i+kLLPo1EqQ9>Su6`!kCa7Fc; zVyY>4+MlR2*O1rr7|-(vr&X?s!KK-wR?K_7P+!sQP?_I#DIOs27|(^fn%ly9r%d68l3ZLH(~0}qjuREqXcdv%3V@M+FR>-n@^M(OE3PgX-IkIIR?aR<+40~L`F8bc}MhU$o2 z=w-ss{zggYZ;H>)Rcq|==PCpC&TAUUGu1RzTwPKBspE9c^V;){+es|XKdP7K0VPv~ zIZ7=hrWxcRKR!QNm&R2t<@C6|9sCL1swEBc{N`HHPJaFQsT`>;NCbD1K2%tGa|FGk zTJ(*+=`NC43Yp{b89lM5{M4&$KK)a+%Ofr)=S>%GWs}%V4oh95^=qf7DXG7hk$Q={ z(YGg1!tV)4NYc;*;c-F&ssL7}zIv&KPzhQgIkELi@hYs+!WaI{PpBzp>OU26%)nw{Nv($V%pD$`C52bxnLT$kF zjz<4pq~=i?9;M=ORjP!)AEstfYc)p=Qp@Q(efMmo9<)>)Q5jV``be!k5Al3EaXN{i zi*g+P!mD|ij;SZ{N6t)rB}B@pvl6CGs+U}ZR_c7_iw-pbJyjA&DxFk+ptt&%^w!TL z59e|7*;uxsO>XnMvD{^LkZt2^bFEv($!$+L{{-gySBAU`9}sMh`gta`P)GZykQ&Fa z)F(Xmb#xv(vZJcTMN|*fO!c6W=wUA@Qf0(+`G*EzNB`t-wG&kki`G(ctojzzU zURp^7q!N1TASut0G@t(UT$U2pi`%FzXH!`yACIG0YMSKcTAY-=NNfIp&nZBLv&k)L z!!OZ+I%DU==S1jxi_}8=xhWk~WmP!kq7d|j-l~nd%_G%ZiAPhYvpRsk7u6Hhaf-&M zdQ^l8Vb$NO_VOIlt|VE`MV9*U3Tmp>@G$j;U3!7NpPoBN1AKQBr>0Z96n*ofE+c>2 zx~8yPm6y_%8PjPHp2`C~UZ<8pdX^h*3h2Z-v75zNBd47tHi21Xhx_ik!`yVfqrUj) zuimids-dc_hN}Ijz=f)|XPIiGW~c@#sIv1vRG%8CII5G{DxG)%dRj--l45d9Dx#Lq z2Xbk+>WBKN%&9moCPr4#G@fJOibKUCaZrteas6p<#TB?S*FXiOr`O!1Ij` za0sQNshAW$c|9Lfm4Uq)p@x3ZF*-yW=_0?QlzKd7*LMi|H zqko}q-cuVm7X89B4W(3+!1G>>6!+Yq zvp{;M&||)0GX0{-YWyuWgS;qnZDeO!z8uT zHtWq8Q$X75GbW+A;jEVPwx0Kfd)b-f-1F{nPkNQNd@!lMci1mQ>Xz!OvZGd3@eoQ( zIp~Nwt{TulE~AvHMH@Ll+0;mNQ`H43SVJ z6bLas72_oQ7M=92ilTE^|5J1blXwzWreV60n!;}}W&PN}A1Q;rK$)Z|u;EWk{5Cp) zjNz(MT}EN1yj5#)1#77p(Azug>g{-XBdIi|d4Ec-uA-;T!QaQ^!=6W;+C?L11F&FBj?eYD0PxFpm6(=eO5W!~{F`T}1DscF(O-Zos_{nPys}gt z=&7xq&M)LJzLJ|qNJf*DSD6dq=ZiX*gxQ=jPnx?&9LHSL;U=XiZDzW^><@RhbIae> z-_e&kIGKc9Oz}&ePvqd*3#g3PML#`HR0EzaL15H$bcWujXWSk$DJSO788sN_k6+ZqI|%Gu@0PiAP5P9WmFJ zG1MFw^(zmim1-Yd<$L^%cG7A*-C?Q}>JyWTpRvY1DMEwLOM*IzrE!{dW9AVxsN`d*s~lvcDfY9?um_#npd^a{Zv;z$|txy-N6pp zNHJs@y;U2r>&l@!4B|9u8TQv0Or;|7w;oDQbeI~>wP+Y8mm#RG&A6hH=y_$(H#f32 z8Gv~2^IDn4jZ`_QY!mY;^y1m-n|h*3uun2^v<}xzfrK{bV;rqk$$DV-O~4>WDLeJi ze)P>8svJ01O*KnZrYQ9Wd%8Yf0Q-2Ya$%nz0@AMso@6jFdt$atP;oqWC69W?>CrFt zsHA+8TX73a+CLm(ALrzX(oGW5QgFcGJWq~uJ++x%Q37s^{(eh#(Q|sqtEH0;11HMM zX=E)Q)y2(ior%wx@8*k{Zf2PrCfW{newd>6vXk4tz?;ik)7LL#5-?$7)WJMPyDQ+$jGol|X7)zout2sBk+ve8(&zzO&C zPzF9gxp@+LRZ)4tCDmDcM@1m8LcoUiq$AhSan�M;p{#Nntum1J1%z^-7*W$N8BY zQL8uu7;tv*&zowc`bUmpl}Z5@hoUF_Qa5E7_-rZ_iK^PA{^PPVfoh;KYpWbsojRC< z4T0|~@m$Yi>L6t~EBaDn;IraHfXb_Nc$POQHn{X-F3*=~jkMtEx*QGR-C%Qx zs1{e|^^}cP$PS&2?*73EG7`@#y)3iYrL44+9x_=sG_~|7Sz%L~1I`Rx*9mp&J1v|l zfg5g8?-sDmn$*T~#Pb9g=NiRO%T)*5*$qnPIgGygMh)gf>I?YZ29*aWCXzDK5TM%4 zKrj)&goANqm-TC~s8STi_;pO~jlO<~59mJh7+tC)X8@LZtG5C%B>96*X%uJT(z1*m zfi*VcQ#OsxX>#%z@^VYy(_QFo(Ucdvwk>VeQIZUEf3X_GG0 zWGreQw28&4Hn77~8mabBO|1AuDu!Nm8&|g~9YqXMY>lpk?7J(}?w#)dcDJ4zhBxk@b*`}X5 zB_xyFkyLh$tzkdA`^`)DpdIYYbnkO7nhMO?1{m>`+5l7+u1ctrk_?>nGB|20@=+BP zLRl#2dCrZ1Q?GzKP4>LtI+)|DfIBuwQZ)g{&kv+<5bWRy-QjlVXmh|AZ%PF@4HPpI zv*;l9UNv5h`Fes6(q*!PRj2TChT1Jqe`n*e6f7`{dcM5}w~pWV^dy+AC>$?62?Yem3gW_muL3+?3on3-uX zVK4AywUy?o7n~T%(IJU}{yrYqtpJ|nb^3^YaENzc8kXdBd`$LA86LyodNIwBNs>ax zqvNz%GT7Yutp3N`1H(NfRn0QfNmtj;t#V?xYi&NKx?^o~%&PlfDV4B_9!g3vz&=)b zHiA8lR+H!w*v43_bzWeAHR!MPR5LE8{-YY43e)vGR>uLZU#6~62R<&E#&K_~RS|xR zCtqCBn(4U1rreEEa&_K=b%{%(=!PVerSgeASi28Y0!%6lDn@E(7teqT;$cP(;Anb8 zCuFgVqJP8#96Mb%lGFMk>TQAy1E*_Fzv&fJnA6k? zxu|l}5cLu()e`%B6ZQ72!CW6B)xn=CVoDuGO%?-7+yc&3OYNt+=nQwLDD;fmoKieI zj5CXH8`0>$cj&QzajT=~rHO$$@5oVH<9a>F#^nYy-=^Rp`j>py*|->Rb$eQX@BA)t zxRV`AsW=Ce#1+~vJ$O9s{e=!nF5bXv^+MSQEnp~Zms9F9bw-EQp7q?8wn|RmzylHh z^BduLL~nRBFQX^mbg!v2CPaJeq;5P~UBHC<0Df>Eyu3D$aW$DumuWtF+c)Su^Jz2Y zM@tIGKz#inKTsRFfMnJ)i6oaP3l5VV74b_iA#f~U@OhIJrBc-_#&Y~yhCAH(hr(1%>g)b= zR7R=lyq!1G7hOYk^8@Gs$1$ZB(Pw_DbDIG?Q9AQ(_Ml7j=XFpSs_6Zq-|zit-)Zb-j7vHc{iCYIK9{wool(%PYYPZ-co%g7(%8JG(N_;7Q)% z+2Q#FY`PYxz6?~q*Fcl`fy5VMW-im6I5GC{8d;{TR#Jt_=_1g4QW>995$tG}p1~!7 z_J)}ik_ms_!QD9yz2HMSH+xJ4=m{nCTOP=H`4zDL9KI|s*_vFuiWr1vW7SsGuUS zKmbUlJJgmtU2Mbj!@(qhF{MP(@|ns&ve9RHA4-{l#}M|Bp&$ius6mjFeh#uu=o6Us&@Bq6{K6Xd*( z;EuW%caf#^j=ymi(?9Kz4?fqc1OQ5b8R1!-29TlPAp#&;QyKE`=eDn z?4y#@ihBVy{lThvX_fjWUOdywDijmz9=Kptbgv8G!(mjG3HYNgrt@Y_ARWOPUvPX$ z%T3jHbwU#9aHw~O=?m7Nhb+Pjy&*LvQYV5+(^y^AJ9rC^;Lkd z6Svrat|bY1uiY*+!6|>!co`x0>6hfh?k&Q-_yn{p9~Y7AU=`!|F*U-ZnWNTYhn`ZW z;WZ?Iy0!bH5~If z8c(Sue$rm}5iil1M$#?5uG2%Gd}GVWAf8SS=!iVf6HEf_l_9nT7~v%uM^klM>zZOt zToco*Gv$CHYRE=ffeG3leExtc1pd609)W?c!d(f;{g4d6s4a1=D@}i_OGbVQC2|}(QxiBp#dIs_u19ksE(`X2KzhLgd8`|oELf9p zC>I%QAFzsFrZGK5KTWH<@+kNTC-KaF0cRD_OR?j|L21~G$()OZN)IrUC(<2?-z)kA ztsyaH<$fRxFd%TDon|~{_!InhLF}*Eluj)MBd+K90o*rR{f5f;oJUGuiK)`TNq7W> z;1`{f4p0y~V1lGnO{55ilMhp6kyJtN{{$^|yWY<~fk+maPQVn^z-Q58cgqAQ zwmVEAYU(7`58aL&Z5o>w{y5$*(Aoy7CaRQL0q3tB?NH<4OH~2ST1dB{O^pLLs>bal zg`}h6Y8RgRG8(BvfNNu5&&`91uoSu}v@CgwReZ@W-~la?$&^hBX|QpL0#bUci|{Jv zF?^`$vQ@IUmGoP^$_YvV*=Q5cu zw@#*Uz;vg8+Fql_e*@?F39Ma_bLg(B13$&r-vbA|r)iRe3sZZUEO+IKq}EHZ?<489 z{tdKHn|8_(b4_Bw4H_qxrGq{pab=e?70Bz5+_jITFmIC=`kj8SFX_1^5jw{S9%*}- zvho)+`|L7Td-%S@#BM0a8KGOpr|3TJN*xTR#IgTSzH(SKXRYhhE?_Hicaqf{3^ z+X;rdbHfu4S^39@NM+2^_Wv9XpdyjbFq>yB#{}!>r5i_)CXpy43VFvhwg9g z=}MAc$Fb{mSzB6tk(F{&kFbaINYv?UXa|RAlk}1{K&wG~YBFe~N2wcM(3#Z(Otq?5 ztub&=T5(Nyut{hRol?>00_ibF=gJMN-x*x%Bdq!`sBTw)rFue#n+h#vJ?`u-qjzx$ z?)~TaP-|%ccJ?29`MJ;uR#1FhLVbeMvX;MVVFS)GN^bz?g6aibp(!dUvvy5(lTR+n z5|h~^bMERN`WvSE3q1Rmsw_NZ#Yw<33SxF%gIhHX8r3h0JHI}`&-*-h~5BfOQH z;4Yp(9n6b6+9gGCWo^}UX<){qcMs<%ofVj96O8&8W+V7?30)Z1a!wXQ4@{ur@oYZD z6HH_4@KF7ivt4(T!C-#hbUn$Uo7m$fxg0R_X`5sRD!7O0PNp|u$Nwv7cq#gKF&T&+ zbxHDKYDYlvUdk7N_qIS+ctClfJdekWY7RZ^rlbHyJ)*nN5+1C5RFd`rQ~w9=wIO%o z?$E5W!SR`fO1jG#fv?s<2cHCQvklFKuH6Gnq8{Inw&2oHsQw|UHEN&^@JStc%b&2W zg`gS?HKe!7DklVPT~k>gXJoy5Pv5hTq2z_BcajDEQf~SQuVs&PfD1gCJAe(8f~$58 zbMFOJ;e^;Hap(;6r}**{nTUyU9^Cx``b_}+tsMUTlupYH(NE`z530y*YRW;=Rx0a~ z;8|~UbNx~Bp$Z@C2x+CE{bB#_kZop?S%Zl%lYi^`W*~fy(|i|hMk=7LyE2JSLKgx? zkgiftm({yyyw0hw@F!jm4pI(G;{;Z*0k2g*B_sIn7R;w>K(Tc(Q8d@X%KYT{P_jed zFw{X-V;vN=q-r;&?Lum%8moEW6lcIF`>XD>48Kp}hVarKfkD=$>S`@CGuYb?J|op+pslEb`nFVq+B93O0G8`W#rT7iRQKou zkYIf14_@%-?DW}l23=|h`coJ9(v!K9S_~X{hK9k8h0N`9Dq(pzGfxco(THc9x7ove>a5&OtS(FaS=)-OqaeV0oc*QV8#baJqC|868s|2s!WE$W%|y~5NdMta11T18$ylBPK2Q$oLNqGrBemmM z@VSOyRTpB7=W$m)r>D`sI<_8QiircI`8oE@GPs#tD61X@2i9X43d;#yi6^4_)s`{p zFEb9kbP2rcik`1Y+C(lvM%se!cbf%QD)L(sYVgA?_j24JwGc?mSl^zdRv zK~J40-KY$u2b#GER+vhP;NNrvO52F(+8ao>2DGzLoJx<-yP&U@Dj`^O%pOx^Be4!6wp-zz%w%52E+y0IuCPR=qI4DnPN_3*^5ZD*P2>H}-Q6c($LR zw4KKKE-(R}k4bymY?3QYZ z{NSfpy?A;Os<9|^q-rKq7cu>H2`(Xv^mm;QI`RiODYIkKle!ECur&JEBhO>x4|Y>^Fxm#tzBfVb3&Qu<&NVm`3fD*I z*JJSSqtSzRaXlf41r}1(WaUI=s_t%j@JSkjD~@nHScS>ZCUat4(z6G6$A{I-qMz6` zx{7IIlj1qIhQa_X1Zq@lFpp&5-4l`ec>ol9l#lTqiU;)afnOtqbq@%;n%+zsWe$}3 zw9xx%@<*va*LXhvz}lWgKg(_6!&zU0e(_oQ>FH(;?tYh>LvJ!w_>Apkjjja_+Q+^% z4eSk*Q{L&n!S!OBNS)oTGC>oe3z#ytpKfLH=>$$`XO>&l1oavy?|JwrCgC#uk1h${ z^{g!CjV2whlY&TB);G7#pEP7{v6c^zHLEp z1qEhR8R&aH+@gG#(8Hu7dVeH5*8J)sDx$KiPy?|7Bk3eEma}Py{!c$c7x_!QkW^3x zfYqSQ*9YqB2;a4-vk+-bR|&I@&2;P5PH{J_;w38jwFY_<)x0gl-+1nV@ii1`SJ$cV7TIbC(^Q-_kl0Bv9273E?H6kWn$V4+O_rVJLjx($5rOOePhGjqRt$f-!}HX)O#?w zCfG;1DSF05K47Daj}GXgb^tOr%WZaZg|nG4k_6RrQ%YgarAEDs0kXd+qoLjR=N6?Qa;SQg|5&i*v{hMB93&ST{!;NGpFv&1I5iZ9-J^YU*jMU3+?SVc} z!9-xyzR?1pv~@uEr;vX}_5g{8PDuLPg$vyunaD&u2bq%5P(nxWE%<-c;TB~@$LJ&D z!9j1xzhHK2sEc&xbKKEbcz2hjq=rH!*3{N}^=)Sooc=$_+u_j9BCTT!o7m18H^kg= zcIp0395clo;$$(OoEBKQmo^2aT7N^%IQc-{w~ zPR&F{;BWB0KU({1K7vfwE97b{=0i@I!AIQ8IuhNlKKR*aaItRiLpIwxrmrq+H|pL_ z9-G;WwUtZ?^Bg=jvD?`nVz1h4Hok9@_qS_JO!;YdIkk;)I_TH-r_3;f+163I>SoY` z)_^6hk@2i}1$M(%?mg80f||R1?(pVDSCwo>giu7X$V_tNc(I5~4o-aQ!BFuC8lBc{-H9 zkI<^?BWu>jHkX+6UiShj%wU^JT&SPlpnNw5u8OPgVRtmdQ|UlYk+T|rwW*|*CFe44HykNywrwHR2U3v3zx(veb;l`=3 zM4SW&aGstd!_XJB)aRfsi@jbP`I8~I(;|No2|NI~i;VP_+94C^ArQ?|_#OAfk2{IM z<$xQy(-u7%`}8x|{$cF$5Gal1pt$T&H<7tY0+(R7jshZyPs_pT9s_%RgR|KZJ^q-S zvD>lUtz-~#)Lp?yBJnv1uwMvyilS0Q^5XaHst;+jIy;|0=FdTD<`P`dU1lP^((%m?Q&1Wz%<&*bLWUI0Ty6@;#*=Wj;nb0kwcKom%!`f1Hpw$TzhD=NJbpT>&{oi#+HWX!eJ> zy6gq|$Pf8(oK1`Mj;C*ezh!a!wwy_;5Azl0yX|O$wuf11AJ~*3&%FnIiM=BNySx*8 zqr*~%B=(kfj@d5w6=w38kKUc$*7mL*W5$`KZUOVmG{t(8yat+!w0U(UJKE+lCv{01 z7mmzhlgx}Xi)?>rGM|hG=>7v=a+>ODtnE_M5uM=^eK6@cD{3#Fq(=|_DJh^N?Sf+T zo~OYfSSYjkFODe>B$niW-qIh*woAydm4|lM6mHQZ?uM_2s-039%H%qp#6yAIuIRG# zRQhTcXyBE3zyi+nOJ2cc`VN<~7pGN6kln}4Ugdoyz($0i4oKTXkawe=l3|J z6asyC9$bff(8{+#>Cy?G;w@V2Tp=(x|!{K&bt!{n9F*(l!i)C(B3nN(eJOp z18Ko0pu@b^zp0(nK&Iw0bf|xkJQ|^&P-obYjOAsgAiyv8So z0$W`)<;_<3WP4;SG8GMUFO$gZ(HGoy?hXCI`QY~OzVavbb@NUPITj*;fxZ~NhQWgY zH;}=8bU*v5yKUS|rUz0rd))duU^6-;?L9dqSIs2nsrhLiI76+^*#SIz6<*9$TS4xa zre?Clwikc`t^fg?F@KraGR}>bTT&Z($iI>Us`&t{M_LodL>`Xl^2t z?EvJhV(QKC%M(x$-5XlqJpRm=z%FpkOL;gyYPJxVz%x|-a^&us!ZB`xxip1Nm=?%& z^aP5o2B$OykJMyyf5jFFnUC8pv@;HyGVsE_bZ>~5Pfd*q2I8~f0j+K9H zPJPkLb>`Y(K(V`=tU9x;WeOk*t;{!GfzH!OV%kJHTIT7Y&|v!Gw9$Hf86NLkWG!1l zp?lATO?)^ZEzMx;wf9g*YoXre1Jizhe=`of@(38yRC7w&Q_(6f)UQS| z5Zt&B@-okHdZjXjQa?E7?bQ?Dzk)#3AimHTj^cyj&p0cPu-XP_P!K>vSHDoc|#^fR0-V_Jm&2i za?~B~yXDSs|8|CX_dB=U{raAh8wfXx+rV9BQknjy9#=Q<(8bbV^(M;{(@PGS@^S-F0IL z=Pi<0Mw)P4nOjIYaNQ$7M2(dnPwN{}1_8JMskt=zz-lC{ej#Vx3Ma$fLQ`J^g?1p4 zEZ?A?UDM5UL3HMFx+HkVWgV%liNiPTTI7u~p<+&m=+mg0kLIm@C%bJPr=sodoeY-W z(pS$7IBf&T-NC+};ZH&;1$P8LhEEP_9hN?rz~3d%*q6=Q(^=w__TF|EJNZmGcbRkD zyW0$Q>N}GiaYFSbd)X9qlk08f4ANRX>{a)b(~N#2H?T@Bn~EY798RINeSE3pMpR*0{Dxh3?-44C)xahNjg8`PMb? za_;k1~}DIoz%EFD2%_x;T8VYpB~gSidyz0ABGd zQ&=CyPkv|yp`s=teKd-1*+O;%f3*GFHck_J(XMb)_+ke(ha3w2_T3H~3w<3p6_&-@ z-(M_PICMy`k9UrLthc%Ml^a`swNbXW$?A5uS!_x7mVGH7b!t6cXE$pM_JWKszx7jn zT(>iYpv>+t^<=-kZ$|(#K8I43#AdPufMAcHdiLP1KOqIC;HlM;g4~Bc(I|ZrZpB`l zL^zH0Ohqw~qP&Y7+i$ujlaNrn1bty2@V)liiO>udq$Ef2#aj7xQ zZvzwj%lF}^=K#XIi2geR)4CGXlDNog7eW%HF8w*J7y~QZgT7-TdMGt-17qILA8_8O zEnK{s$bjDEt8@pt$x7W9Ds?7gcc#!@ek1=#J39aw<%hbc*#>vIr%ZsRTSgYhb$RC0 zwEIv=iA{6gklrXAc*Hv`r`3NNVuw6<=N5|eBs zx>ON;**20la7S{RmS9^E(C@R`^3ulS(P{19=7N*R+t1#0Cg>7wc5h>UexJwJ%vZ#J zJ#f{(Bg7YaJFq8YQm|~WkUw6agg4Up<*c-MybXL~oiJ#HJLM_XssNmrDD357Vrk>AUCBFdgFg! zl79hbuE8Xl2fwHX?*_B@AQ8M?Ht>Bt8%%W;c+(j4;c(fH`P4db4{6JFUFkeBDFR2TfS}kUilM{@H<6-eJMh-sgcAULJy(Y+?EZrtIg29qp1WBHNaX^KwMT%pl?9$EQjXyy;q9byDb#*CV z)f-4^&){uXr?Z%hX?Tgw4^JI^9GrKWj>`+EGZFyFWtP5;T+2`TfF$2HnaF;#0$Tr5 zoaP>+bC_MY&IL%J1n~Xok(;_^FPH{SdQ-N3ZJPxu7cHoYPHi4Q=id|4C+SR#)Jd&gX!ngccix z8PyV6>MD6FMPv>Id529Thmp;F1mCU`?}tM=n!3_%Dj-jRB395x}X z3+nxFR|>kXpj0n#JG)EVKK83y*lU7M{8IycLw|%<3riMS)#vla4T~GB5J>Ku!|Ya10nYn4zJ`6-80*xZkHQz( z#%(-Lp=Ni7uHgZ5tcbU4Gy;d(YtlFxv+q(>_vrp_-f% z2bs)=IGZ|vLU9_d7x3BN7=;a|-EjdVuLX+@1lts_DJrd^SCxG1YX!O;+cG`_a4E z`8#kaykx{u|K8v>|GL1q(AFU*LKlWEat{VhhIDkp-0W`9&1Sc{!+e?TcUv0ojwq}9 z+MQ;td(C0_?Tu$9@mPJnLP)k`!C716j`9A1 zEtCR2*=i)(=U@)*MxP0jHO2>LVhM672jvTtzhg*|&N2BpIS)W)tAfmf(pMGxFr7Y# zSsezPxJ=)%wV(q&0#ZI@|8jDB>p4T5tL__bEq{%GKXizHO~~os%g_~}MZ=tsqoL_T zmxc}qg!%7>Z}j!`O$+P_v~up-TuwKfzN_O4x9ju~XNyzV8SYjF(!2{TyNW4ka_ZMe zB1XdDI%odq#don6J0R;(S(XAr9|i`TkL*l#ocMo&bKF-kV>gKph@ib*B3aCGaM^6| z>d!zUdI8*8oRPLrhj60ZL+#;gjpIdfkr%;V{f5fA#e%t=3b^71xY^Km6AL#3maHngjJ~W-m;r$PP<4q-h-tw`4cW^}x=k(^1AXO>vP!VPM z43w7R(AVqJQGHy_=>2e`!r@GB)sy)dI9yfTN;fdioCkId80J~mV-tB7g8iJgJG_m& zF@0IwrvAx+9KpN(A0cf*9t9#o`h`%~72mY5*&&%jTZdloxAXe^(cV-3G~Q;xUG|#O z+k4!X54^0Vt%FR_a#?7)XusL33(H}gn%iy<*%GqOSq2^AkZhAYdLj=)!r+Kwco4^u zv+|GAU6(c$OnTRc)m{V7WFc0(2eO5W;d~B)YkLs)ln9BRE?|kfk$p@+Dfk`#1*Fsx zj^8(W4c40pZ@ww72bo3E5Nc^Yc>)D{iN247!zQlBvycpX4BfQ^&VxSWsc`NDx?oAq zJyjn0x|^7R)xcd-{BdbfRRCE z6OfaiZZ<&esG;MSo5-(B(IbCLz{nv%aHi!0GJ)7h*2X=&;;FKC_vrY_jNeP?AcS5WNCjZ>;+d>a!Q7SUD#q zI$al?ADwZrY?LLa!9B>loTTM&Q7$95`xFx@6=u~3gR{Z}B?f3Iueh>_*YY_XK<7Np ze=_f9k<7iviJ;)k0{5te{eP72;p|F9B+3nvs~h2VHG}?_4*CCaI9rtkcny`LuVGFu!-@uSN9Bzl z9bDmC;y)Ca9gNmroi5%*Zfm!?+spgY+sszezwwTa8BPM{f^!@lrlmXAc0{#4N8i5< zEVono@gftg$6$I^*A3aH*P1PuNJHfdl%6NLyfaOwuuUWi?s$A?0UD}NG%))h9?M&S zxxy(2c76;f34NN}tMKRvDc zfd}{1Taf=aN1e?*S&xo zu1;@|_ZUMHz`SD7XjJH8z5}M@;N;LHIZKaln&=n2lHX9iJHv&(k6zjWskL{=8y&#= zy-p)fI!&N{!(0CkJ!m1o3=A++NZ@Y!aY*hugU*A?_|Q&+F! z?j{*Hq*;b931hfWCo3OyOz7aSUTCZtk`6UgU%9`evRViLMTtw&dM*p25_aLbs#Y;|d5 z!<<6!2706ST(L)yYwHQ#xu4hTjHVOkV*p&ZPcMxhUQ0sL0-4Z9vK-1w4W#NzOH%qI zRgt+a53Ds@a@ao!!LsT(^3Kzd`k5!|uxiY^cqg6VEXXaTwBNxe_nW?^8YSS?IFWdk z^1wx`%z1#`9q1%Yk?6Xws>3}TLcgF>Z$Mu0vC0RYmIXR^e(?St$g;%(BKQTZauL|o zDxF=@=tB6(W#9`Hll5{1KK~2j>blTE=HRN@=)PL)BIlkiYpUU$1i$o4V5+w=K%aN| zdvE%xgv4|H^&SX>_!{{SIzyodo(M@BNFRI>%o@Hlw0GE#z_)lq<7bZi8ooQ2BYa6{ zz*!w~KIrvd_b2e@@_h_c^cJ#(%olg6xo)=E9@b|HI~i?pOp2^H?Y0>FV5=uh?{4`(Fn3*NvXhft68c@okfnJ~jw@Fpm) zu_*~BknA|EauqwiK26bMae}Nedcl5RiH_V;KEbbNblmsg5GBAL{K$Fb#d)-U!Nzt| zd8Dj9!aqq5d#KH4jY^%oZN4#jJ6BSX1fA4xHe>Lh<8p^HaXCljU-13 zB9n};nIzighHgF26w_Vx1mLhedZMWTmud@i)XMM$)=Ea?dLrOQEz~&Y38qxLyLK&NPE$gArtd`tT%kP{P5ndYUuNd~*=V zlvO4L_IWO7t9|u$nyUIsPGqhp>D_Qb_CYVafG#?f-|F;S6RvD3ymzoH)R|pSY_jro zbbtkT6Wv#2c208(Ahxq`X=@>Em_v%FLO6fi7g?b5cwf*dwF#Yc2EKZiUjZdIL#|;z z61iK`D z;FL&SZR7>A70I&SVyHKg29u<-G$Q6I;A6eu$K1ku2YyjOI4(DVQ12jF)sGv)9d85# zRT1wxJcZP1YGjP(A)WCM?;aRTUBMapBbBfOUHTT*ZkJ9BY?T|Vc{bD(!*fkTaNLtP zjrv93)3G_)h`r`^H-`I29oy5l&iso#mC8JK%i?UrXLv1JfpaQ*OE|M_TPM`{=xgs! z;a%fD9pVYk8LSnSHDqJx=*XcVokFt(&V?QhI}Y*-l;f22Q1~#S;zZJmAIgaGJx12|Eo_zn#1@ z>42(7I*z;97IbEq5^g59xYN*jeJ^~M!#sf--cII+bI;l8&EoIpE9~7CND&qYc@wDOtW24t>eMERD|}T z0(idi&`Z4oqn{c~eH5zL2S_wJEF=dKa8fu46ttqRE;Im3#Z~CeWN0Qh6knw=2V{m% zFpBK54Y)~PQy?tjb&?JE+W~X~%gHrbRSvQ@$X0oZ?|vU?!*hW#ZY=I+C{785{c zxtX+=Z)LTVnrd&UInr}l7$eyRzFs-4^amO}P`ztzlr9_9tRHHed)wG*HFcK+1iO}* zxO@f0+0!=}Vk#0a$u4%s`_q7Kwsu*dvd_&Go-`dBdCUQR2 zuVPnq`@Ay&#cpRmaJu{RI|n^(cQ+5J_sm=Npn$C}bQ7GYyU$DGd~gRi zWBk2CDct;i)oG|_QfsJDtvfuU#pEy_rxcNn$UfSW50-NC)lxI^Slk2rY&37eKGT(O z4>-&v!^tqI7pAgtQd7(dTk)(-vW1jj*?10kZVrlD=mO{?&x+OHq&0+fWDdU2j^Y}0 zS4+ewX8PA`0C2+BK*YufMe)TWZxk5*9C*zJh(E=um?=_1eGo$RxF>$X3@m}UT?zKD z9d5C9!gnYE3W1IO7nw1yp*~y;B*p^Q|CR{g!x`S#F**j0lyz|W#nHp!HFU;B#4*4F z9g>Pg=)clY)?7B|URI1vfc`HmS49oHA-!OoZJCE|e=g?m_AEi{!&dX*+B|tW zf6hyQVQ;CJY7_Z4zJ~o!_9)ragUS*uLC=P-y1!Y_+u@!H9&{4yb?!vxpjpmo>Rzx; zTaV0#_D7R>)tr9=GyJ0BgQqEla4qTK zR7gv5(WvrN`~ug9h%XQd0eJhDkkfDyh^!uF+g7xPxEEfBCYV->07a<*KT}5}yxxU# zt|jz;bHy%DW!yma!6alTO!CbWZzF+aAw17Nk@tHFN=yZw{@?M>?I9_V3O*KzHmi}W zI~)Cf68g4ALLw&LB0>jf(*{G2wgPqYKWM(blATfr9d>(ChMr_c$U5;K`kplqRzTY^ z0!ZaX;XJLy3-B7eF#7a^d>IgcWzul9kkpr{Ku4;nwb)&0vRYajY+N+HS~=WHUcX2_ z)XZu|b?=}TXQgzDJFU&$R+5)GSj>56rZPV{nY`?FOK+z4HuhfdLo9a(db#}b^z&M2 zC8T}Cci)nymhVdWq;&Fe)(<$-kr`)Q1mgU3L>*(Jz?2yJFtTsXpkbVpubh zA5P1qsKzoT(~aU9=r~G>8W9N!(~IDw=ZJ@pTY3#%(>lTvuq=JiOHIZc z8cWNGkKpwCMt=GJSHu1D&Uf5*kraXRB^f#jQT&xSzZD3B$p(;Dv@pJkvH8WDv>}~{dsKsZ`v-o1so>`;Mz3Su&O#q6Em$*Jk++sh@P%{&KcW@X zuBgTBI>Gz?C5{-Z9<1qIc5B;dji@?#SZDeOEZR{L zB6sNt{#Hta#>`>8SROtCU)L%Yz^ywH3WsfY?uCF9W+V^!|A3X;5i5|APz0`0AJ!rxK*biGi5EZacoqCZKMV6|8AJaC>)0!(Kn?htB?WE9@#0=;qi+4 z&f~Q9hLb5B+zB0hdx7?}gl_m1batKCXA(rmzYLir9DPGg(jU&wrKqwypjY{ZUhe@; zW>w5l=Sd8S%7u6Wo_Z{6jVZD=fs&P#mWIfE}G-sW?&OV@b*ZP=~b!rszmO884o^GO>GnCp)XRNnt`#%TH#g-1_^KL}vdMor- zazTx&i&<{IO?s*R&R3IF>MZ6;kLVjdil&vOiP_m^RzvCu&xb~mq&!ezLwgUratSnV z|AQiAGH(8i;wllkW_WbILPvB7ijBX3jeHjgxyoL{W%3&8i3Z5%>Ec@jPIn1h@$H~^ z>m;T})fAw((;od(9&q=4ZgC{d?vV`TVfJ@Lrkb(&O&FYL+8*Qj{X<8OEW-sol8<# zaVnA$auVC4wpB{=CGr=ZOI@!qC9S`-TOiyb(lGiV($YUCyx*VRei|6^$*eBnCkN&g|ivhf;K{LsCAPG9G%l%u-wCur}4Ki1j$n+eTBssWDLTk z4$r|&=q!dJlVCa0++M*iGZ+|HAm$Ae8Gn%6;wWe~l8Fi_i#z@|mWz0p$JVpjY(A>& ze5mOjOYv+wI=uWeic0n`_3_-&1>9U0Sr3{BeNITCd<$ztE2z4(5lGe!rM0x$NT%FZ z2IW4%9I!B_%xtFt-M zUT3`y3=HImza2X)&@VD9SSd2zT%;A()2iS259z6-O9nqmhtRo_k42S4VA!X4F>vhN z$!fZk&&G|k1}cyeKwHK_8-9n^0B2o?6e6EdS)Y*ENQ3#M#M=g^H$$oce5_(N){A;@ z0z4M0i3^Y-(ir_fHtc}7LyiKI%_Zg&M4rwm z0og@@Je>!q$ty@!umrWqJRoQFz!^3b&T?cUl9k}6i;A(R?N@-j-ISV%Q`u7fg8fM_ zB9K)q9f^nNyfl&kcSC)6i~YeF5DrI{l}~C;>AikfPj8*G_vyq;@Sa9lbWkLka5uU( zlFGj8FYbKu8ae;dr&#N>wB|bZnzh)<=KL2ltrJGPIYysssdoKveB8l=wc#^ym7=Wz z6aB5#n??mC7d)?jAj$u(Qkq?p%JCuO39nE8K{d^fFKjtq&AUmt=zsDh@iQMNrD02P zyZ#AuV2XHVIl~xl*lcQoMpc;eGv%VIOG9UMoJz(Z_@Js`UhE(|1LS^I;JObO2 zgdR03GHH6?uKE-GYYTCyuRgM|wu;w~k9hY9sF8D#P~VxaU|D3DPGZZYQam4@M>6v2(odcliun8FJ^bCh!Tgj2 zewvEp!PJuqPo@dpL=Yb0kLZNP``!aTT#H=-%W#_dV?Motd!-aMQz*#&M7Jvb37_OG z>ZQ#Sd zZm+xWJQe2_%a5*QFh9kRQb)(ak?;+3VP|nCeau9uAe|#!fr~OHI}iWLPS%Z&lDlYc zMFaDO9M?KdqUwf%@h7gxR7Rfs9&g+f2C)*@0~}+Ju6i(&Tj1%^cIBb27fwH ze?!mke+%R`x9A_;THc!2nQ?hCvDjImnSoRGcjJ>;QEMjU;@fyCDCX9(ziB@?Jvg*`+XFinN@9v@q=~0ng$F>%qZ78VFEfImM%66RKHN|+^-MfW)v)9g{7jO>y6;uw|%{=&t0(#tW0 zZ30Hy34W|O!bNmX60q4QIKhwNFfxf5yda4Yo&lxELLOmC{!Gr0T6`>gW1ofAtPtK~ zYbd!Eqf^|>>aubC4p_nEQa-U5!E{BZO5N#mOyu|ES@J+Rms;GYWW?#ZvED7_Uu~Ta zC&u~X-^U*dX9|4ruMORF^E+w$m7SUDas6*AyHm>({0;pnf(t@Ntvl9V&K~cly~QXQ zjtjqv*y-*ktigNf?{>2jt-I=7I0-yd^Bd#}TTb4i134xagzBdct zF!NVrS5ZxosmuLRar6g`aAH@9T`>i`hrg>W91Xe9t+t_QfNr(|hgDK6z;?nfe;&_s zBODxC;f^YYyZ?ZAg2Qei!aQxb95P=`%G4>qPfhv2V*ccOPV_#{ok}*ON zC}3-XX;=q!$4M~eW8v2*LrcP;;-`1{P==%jwgER1vX(Gs88km_ApGD1!Mtn%zVe3d zVGa0SWDpyu?v=A(-aV!al{adcl|1G@>OSSOUc-OOFFP+CJNPJ}LfUH?jkrnCKEaEz zW1Z#BKy8{onO@A<;ui2O2QmjfhGzQz2`&%JahiLDz2E(sdCtz{Zy)zQ_%qAB^o=7m zA`^lUbFRBxzN9s!EBIS5eTB$j+LSKCc{s?&%AF~)+~DGg0pq@s#gV4G6%q=F)JOVF z%E-^KGi;^wJN)yf=u@!*b_N}yThS|}5l&DdE*JiTqwT2B9QkyY@Ll&rw*LjVijVsS zW2&twxI!i|7ImVrH~`+XM%V*_j3W493L{}54}Qg9=mmDefuTcX^s8U`#$>35hGT{} zM<=6xH$fLXlkFz8(UXqh)6i|Tf`geWI@-DI-I|#4c)m^G>>@ElsW9 z+_WnME4$@Fa|3AtV}irOkG*`>G;6L^+nejO2rmnaOxztmDOx2u(O)#^_m0c2lxkW# z+*pE~pi(45oR%uf+2}vaKwqUHN5d7T(Z%qwP-c*+xZ4*1!FZ3~{SK)n($uoCr_fuB zg}3J$62Z>1)Zzt}MeG3uD|#kUA1R-Wu~8uk584B0edl4Wn2Zi;4sNbRzP_T*_cs{B zbTMzxkFLO!bzH~-_3?02-gm$sMghMrk2xcb)P+iQ41CpHP+M&1x8^~UQbR~!Hmk$o zS>pT14LTQ7Y+d@B#OWb+ijfQq(r*U*)n!%B!i4EdY;Y22n&Eb{{YzWlz*U{cPXUx3bDF1D5Pq4pJCzvxF zm-yD-*{S3{bGNuDUCG-O%$86w?qg(kh6M?g+^yCWZHvj(%jzpO6+OT^XtI(a!*eFm zdsE6?@%vnfe1^2ra0!W=P}iQOSLE${xpaf5@-jI$szw4WD&!|ixJJ7{Q+-vq3QlhX zT}k2=2(#=<+*=yWsTC=G)-A0cCM5XnTslV^{(%?j-OdXNli83|V?3 z(0e()t?mzIy|0 zjHh-JU3M4D0gu5Yr*rn9R#th@Bli$kYw-PSI z?@RRJGXx{SBUU$iec+y3Cve9-;Y_s`>5r`+?t81XGb->gnln_xKO;K9o2);C+Ql|* zyLSV{<4VTcX-CD*O@B6atUoodg@bBy`6)Es>sb$_Fc+Z`n$3d9&?rEILK+low$x3g5LN)`WVbf6EJ_zp)I%tt!f`AYwCzapc+YzjU-ulLpBYVdkOxC50je8 zrJ>fTLN~}i*c2X=a)H5b2RwPW`avzPS5hizCjuesq%kenFp0aLlp)`TICcv{Uxh!2V!Le=xk)s1uwS7#kM+wY}Z;S^sZ#6aP#vQ|NB|%{0;I zy7>Iz%;Ei3VfBRGMESzoDEH_Uo}Fw4Io{^RQo)s4O_%~*dp_SbZ28!U+FBYK%&|ygssVREBU)BSkJ)u1DN3>nwr`x675UE4 zw~-m7C_2^|=xtlT2Um~o7VX*%kbJ$t!jfq_s>K`o=-yq>rXtvwc%NsZrOblj-s{Yq@ ztTWAeVKg>txQ(57YhiR-V2As|$r8K~%wccWk6V4r_W>{XEI2JTHvB!|QJT@=wO*IN z0Bq|?QfKMIWe>hgN8SmQVrtAjMw%tP7~e_bH6Fvfgi0Ja=Ehr0~ieD^{aR zJsnu$r3w`AKMV%~M~waMZ^m(Lr#;;n=F|u^k9(LW?Je@uGqFLb$ZG@jc%?M4f0MJw%k+%;5ObUP*lBM) z@;-*jCdMZ=h?I_g4rUD1^cMJQc*p&zV(r+HZaH+T6O6<5RexQlS9pI29sfc8V9!ZcJ`IY2VT6J2sz;iW z`Qig$Ftve5T>&mt5lr;~AcO~@h+hlG^IfA&4Dn>&2IJ6+9RB zkboCLC$$py)?9HjIPc^n3tNWi;0WqVCZRd--XNJs>x!4rYfpiqYBHNokFY(`T4?fW zvH6V9Zo*_b6_p`1^nnY>HPi!xXJN6-gd5EV4qOfdFUi}7FrYRM|L6mlG!m-J#0m01+qIUy_u!n$yQ*cpKT(u6$dkBBY{E+5hh3Wz);io}wPa1NZpT%;pY zc{02P#j*FHAhd(!fTFHO-&zUx{jdEh_fabw_&tR~X@iyD_^JIRT{N<}eS-=9+Yz4FA+BsfvT)l-VxX9nQLp5- z3vTw04oz|@+vCl~#(Zak|DH22THoKp+G&0aya|Zj6R)H-*;;1|mQUG(FlZ)^{T!W{ z;KZ$u9bmtXo^y$vsMeMLfLCJ?I??qkHxgQgumt{5|I4&^SlX)QfP1+oNy8t*-!_cj zfG(^tGvS%|4kmLIt4OZX+2Hv`le{!ZJVJILpQZ_P5yQ}*-vN)+9{it;)bC2ztu+F8 zUp>rLr-b@ITJplB(hAk#e@Gr{L@uIB$cLGs8#YSb1d3Y}IMrRCfd#-^CyA5kW8s-_ z6mNAtnaE4w7V^Na?`Ism?Mzw{isaI8lKw|;LaTTen%#51oDjHSPtru{=k@sr{)leT z7HAFhV#+vUneI1An0xK|PQ05TSTV9JxGbIra{1HQ56t#fTbsC>-A^IOn-MJPG_xDH z*X>*WzSd4Bb@-5d)O+nIkz>I^&TTW!Sgv+6AGimj!B9-NW9UxwT)-b$;UqV+C`X{` zN-d3-kMm4)CqIiXX1#n=JSCOXs5(GCz>BddY&#Hw7@C!&;@epca2>hf_Wi;xvWGMu zrpuyC5r2qn$XVJ@EQ6G{Uz=NJ!^yG&KFB|Om7qTTAAH%1kO;CGD(y#lCvtY?4B#PVPd_UIOZhEaC+C-iC{}SPBMig=U}(c|6_eD6lDQ#T~3KCwQ+m zzsKf6p){V{VC!jfyz{S6i^%v>ykec81^9#4k#0(@SR#GNOJP&lHFc7{O;(j2%6u(| zx@g<0>|9PXGxkg!Pqn*|BBd!(K*46k(T;(`H7Z6J*s>|lG_|U z2d>R*$aU()ub>+I3q@jSbcY+IzH}o0z>&c~E7C$pB%Fowdxb3)SJL^?Mv;+>q#Y_@ zTC#`6f(=Q4zo-G2?yX2?xdwKn3}%FHG5rPX=7b+`9#GTC@M5jUk5Sm3W5B`r7QOB@ z=+)|A(_e037!a3-P}ufnDNwP0=~AkI-QET#o+Jc`Mz)g2BpYi3G@vbXiL1pG6sZ`r z2e7mG$T(;TTzDN%4G(lIX2pZzMK)a#;5yqXW!0(~2H(0f%>HgxyR~yXIKXWiyd8R~=P=4!qV>sJ8!Z*6>Q;7WpndRi=ykAfbc>hA zduflAyXl#odx0jgej-} z>sa9qoGJORFDo7Jr&LIvLMjnBt6ot4l!q#_DLg3z2uwEk2+GmD!bT)8q(?GYDZG={ zU|1F)6?U6=kG>PnBhyI}a>6N;8{U=GtUo%vd^{K4@>O_r2h)>qG7eUDLXEQleg90< zrF=XJ?|O5*|JCwv=@k8_WtP4xd--#@v(i!fpWe>8<}Njcg|fs-ftj&cqRnITy7lZk z-aNQ5Kf8y#dC^j#j_wb$rq$R#E-=R}5$Njg8rm4j7djkH7e3+43ukbMd0x(@me5x? zcR~*%8$rL4ODUNsLFQjxdIebeSST?C2vNl{g5Wj1I z{{yG+Om4H2Rs|>_8ox(uoN5@G2}HIDILYu=oy|tq2%Wy;HFwZQiJoKg9-I8 zGA#CxuF$;g5stI0q!M&j?`dmHg;{ZCtJ7DQPmV%O-5ogx{dqg&ChnJN0w^9g|~&1f^XbSkvdL0Ffse}+-5#^Pk2x8kKlJ#^<1}A zprQA>dE9^4>xWFYDpG4{5EPhiXgj#+CnybAF-z+FT5w6d2?k2@;%?O z>R_@?!-4jlODY)wC9vQTKp#I~?m-!At)0{Krf>K*}6wk8dd^u7GA4AzubB^NJ2wVDC* zK`mjpm;ug!-_e2n=4%PwZLIquWSLJlFrARXzZn%ir+LyIQv=ddNE;tR7u$ zZ3ql-{`7LVQM-@dXTSA#4`kLp>LvAa-s#X=G0FGLDmEEz8xmn7bv%|iclmn_1@m`YIlj36nX z3;tK!4%{x5e8LusUkLSdQUHBaWpLQ5ps^?j=6|nHOn5G4g+k>n^uxKZPpdQT92?1h z!-V1JM`xps?t|Lx87f8|s0{{y6}*c|vYNI6M=@Ev2-g*b`|A+&G6QJ=@vbzJFXu>N zgV*&h+)~Hc4lNBWOQ%R>pte@oR9;J7fqbBM(h5b9HDw|;L8n)2?U2^fT5079Oo|I6 zJcz3oSrRgV?kzL(7>}(I_9VygmimKn=L5I>gRRESG*7i^1m4)s{Y`?8BOSes;HzI) zRsA{inZ^_Aky9#C#Q!}w%2Vx4dLMrwZ;%!5PB8xYmE)qllNa&KYGs~E>c=ngvT|j5 zpS)sy@vh&Ke0W~}Ndtjvsn}Do8E(K~^f{Qf^t6ol5}b2esGFLRg6JT(qfhN2M$l_M z5N`@HHm9V-bNz`uV`+T5u}3`{HUqW7v-*srm9EIKs4n)!w!cB>-0zDmglV+7=#r^) zAm+5j;y6^28*pju#Q!@9x`UqL31uc`)|D$A!R=O3Y4 zikBjIK!>B)>QvC_q%n)dg9K}&+2atSGz2KP;x2Lpm867uW2u8>ICNJ$LR-_3c4l! zOXtW=ApxT!Z^S=i6UrGDgqo}w_-Z85(9@X0ii!zj09gNna7QmekKYP=aX(@Ua765m z4cjY$pNcrIxv**aVa!2jDX)v=;j-EwmPN8^W@HPW1$%X$+=jEF9k@oMMU!Pv6ig6z zkhUy4c;4)iiF0@kx$0+-JiHW&i-X_>`Xa@mCY%38^`lgM*2f)x=bv4+4gEnXZ| zmD9t@Tj{RcS6!rZRkoY4@cNC>H7C*970MaikvJk!D&7m1_Xe4g^x4?wtg%X2xBS^+ z`-FFR^Nb}*PQz7qtGCqa_6uh~!1KD=li|=jsAbVlX;tMHQcJU$ZP?wNA9g;yp0VC+ z;N&&#ntjaV`cu_W1vs}yB860D9i&d|1D_=}$Lv=QYKu~M&Wq(7^cnw5=Ry_CSWoJ* z_rTyw!`n0wnG+ubY_t4PqG;11MWMSyOTwod=c zosS9jlT%5faw}t^@m_5weUjhmcg%F|A#H^DP|IzsH8RM9mBsoOZHje4el1@EzrI3h zp+x1u@)NoRSu9;?b2zD{@QSPk5Q35r~^D=!zY`FwMN;coeKS3whnYI;P;HDTZ zW`W0~ulNyuo{B<0 z`-)V=tF#cgz(3H_yfeMaW{`J0t0dB{Jh@z2U90rMXjA4ik39VL;;&sQrO|7RK+k$sID>TXk4ONJ1?)UT{^%^f=^Jy z#tdlfNO@KY{;p+6G&v4e!b{8~=aIlu5sIqsVgT6`ar_pzm|Z+VU$YD1pYUL=!(NLz zk^!u8EomlwRBNfxjm@$z-f#rr@p99D7T=|{)Nd946H{M#qoRQjFwG$no8gfwI_mUR_$CzE)Z)8>F7WlUH-=|yrxZp>S-kL^r zQ#qfcu}VuMF9`ZuIgcJTGMRPF>{dECnVP`ID^ulj@_luvJ=X4|Wm2mt9$AJI;-%74 zHKVprPi9|L$8qEj^LVKkIU+Tn1CjMLMjQ#8Z3p~=5r+Md*bA+aCajgTP2_YDFc3jJ zN0ZYPP(N)FU%=Tq26y=$WMw8prt&%XtOi2S+6x&~D}k)`#D>5w;tqILbNN~#8MH69 zZS_D-$SATAKKT7W{BU;BN0cG^$wP8jYz9q7eqo>Vg-pX!{myE`p|ln{^>(~GJi-cC z*JjYJcHs$7dkui^`=XdcuJTHJ8@{2}@aLT(rrcOgC-0Ge7~|#5QY}2q{_<=ducbu7 zT_&{*vMY84dj<1GbHujwx3!mR@yZT;iM+-L>rMH7sMm6N+oBWgsd^gihgw6L!qY1^ z&93^t#vXHzQd8@qE|*;727EPZ>ou%Z&IV(;HdC$+?SFM3(fi~Wt&_1*3F~Fm!tm2x zk?xVrz=FH-i8v{jfg?+Ly9oPh*6|JBQxec~G zERNuPc`I=-?Z-z*`Q`WU2F=l%Dy8^h<(x86zN__>TS!@zDN0#2kJ?5bVfTpq6G(_; za>~28taDmGZ>EQ=B$fegji&lWZD{y1}JnAEuxRIC}z^{-M4SKw09Um~Mct z{WbPI0#g#k3FA22yo77;329XaiaYsVV7E zNm|3dm5vpW{zr4dpYRac%KY>^V_+(`qxYzU{H2T}fEn-v>jG}*88kvk)&%D1)mMkS|Hcu-`WzmqvZuOq)z6+HcawSN4D{9c=@ zRfz8NmvDw!xonePQp+nD&B}1URuaVZ%|of1RM2x%sXF+ms*EBQSE< zGK&5!rbk|Vb^g1Q0c`eS=_1cc$Fg>8I4`Bx=&B2`k$kH%LN21TP>A{ljQo1;DrXSX zWXeerl?&kp+o`2D_WCcz&kZfLyX&KLMXtav;osoNS=j`nUQBe3n&~~koCSXNneoLO zp%t+nfhnx5m)CpBnY2o*fYM$~r@Vr@aK5qMJge1~?&H7ROFF_D(0)=tO{+ALD(n5s z!}0>DGHt+R))juCJA5d;Ku*ZRP-C0J-Pn`NgLbJodnc`?xzQhNlpC|G;$t|9+Om%1 z03rBZACe`$;dtIXz)yenl@+#=97q_wCv#_Ul86gu#y4nz@=^&C>}>G@Jo%4FD^?zf8rc8AYVsAp{3)wV8`C&s z1sp+!z6*>pEgQruNqO+aRa45SnY6xATj`*jQd`8YV$wM!RbglNQ~sDemp2#%oNU24 z!6W`w{zF(ibvqB%x9T?z#FxkISEv{qJ>S}NS6@@xb#jo`Z7V^UjhYVXN37(THz_Naly5s`- z)GA=F7mMHNX>lc-uC;-Q9mSVUkzPAT3c+pB7Fjlhh$T-1=eU_|U~7R4rNExML$s8l zL;cuGS*YGqGD(+|AyNw|Esz6?E#RZ|-{mi=Bi%DZeV9|xd854!)-wb8dpR3aW&cQN zaQ;W~cUD^Ou3IH8s~0xg>0_)mW;(sSH`F@oZy3m^^)S~OeU+(3Mya2EK$-6Kfui`C zT#(L^y0Uf9dk*A3)QoB|<(XXE$SBWJp~vQB`6lu|xRjFfmi#Ba@)7JZaF(6W>efWp zj=k;31T0FkvsmD)51|Gw2NmD~;ruU+AzXq7v2md|*#6JH(@3BD8@JOP=&u?J1%!xi z8YbB9!Vqu-udrbyAN(c<$wt}{$iNGrG+p4KIxNl;JK%hRFF-EkR(L0hi7nA{-Gj<2 zJy$FI zw_Fu|l^&neVQc;IrWG-vM9XSSVITBk!{vHUpeSk1!tY%Kf;XY5-l~z*6qw zglD0NNLSB=KKLIbhAx86ppcjo=P?I4NV9@t=?rCDb}=2*#dbhkp0Ic50UFZ9;xVLl z8uSoc3!9jP-(^osSclQ2G$4iWzKp zLeE=4+oBclo>?EgiTYlBlN?csOQW$>EF{h2RrNu}h(K@qdfkl*f`6)3RZFYPlHMp|q|@N8i%7k-Fqjrg?IWinn`l2( zWo>}1%wqS%A#4me2E}S4%-C(|XzYv32;EI(_Ch=(o@EAUD3t_vl}sE7z4>`0CLJM- zu|cV_&=GiGl6V`vR$t+Z5A!VYE>%3|GBIa_#bOeA*gWW~;#phN-s0d3>!E)rfH#sv zhLajV@}`l!IM*XEo25qj;(F2!s;V+#2R@gaqNCXXI)Lop2I-AFv>lkI>Y`pfgwp#3 zEd{2fIh`cc;}_K9$f?|yJJ?EQj|&6>onsF~s|Dxi{e!8E?Cu_Gt~N+d zuR|Mb&GLp>F=p8ON6xH&QunbdMhW?aURetnNB9tB8f`7Z6M`?TH1aH7vl;ZElt4T& zo_xlWM&2dz7wSWGx&=KzD_%fcN&Xf$vN-55<9)M`PInVewJ8!RY+(qz(7$2tdJmxh zT!G7d&oL>OsJN$*gjvzI5o{s$m*6?BM7G5s@h;F=g{nU67bflD%=!xSYA(`MlcSb? z1&6bnv;aE!7tUsJ3at<}I|bPdL?j%?O;rQlyl&9luH*T62WUq&NgdcWUICd@BJvcI zk)^m7kU52K?m1HMN+K;`rIgo@r7!wuy^__~JL*jFGT8gA5y~BXk^Vw{F5gflfDzrI zj5e)6Gq<+$A>7@*5?UR3k|vcu$=@+t)jQ;0>(zF?I#qE(W3>FP?fs?pm!jG$qoj0M z*{Cj5i>TSy13f`ICr<#Pvxc3QU3C2Uc@1d|rvDfEs#oGXg^L#N8DrxwuP!;M6pMn3E$N5}?x_TVnv@0}>neQtHMK$-mg%hAV zc*3v9vKcL$fJR^#(1Kkgt9XJ&fY@{Zv(lOgJPEq)g5V1Cz#X_7$qVPeXU#&d{86eU z=ApgtRmDnW*bQKZmBAZs2D9>&wv}yZ0UOKJHQsz`?ea&}KjnDL8#!4wy{o=d(X@)vDV+V< zI5QuiZBHft4#nUyj_hIf5javAhJAI=106sP4g)9mCm5{f*c>quuEroX&wUhT(ljI` zu)wys)qfLf!1t2{9c&{pBPv8WaV%5<)!@_22v_@8-{P2UP^DEBkiIUS=AD2M41%gs zMgra}c-6;arXPT0P-Ng?uKfqwx{gE7l?HXQHnv;VX7S)5PU7u#=M&f@(is(L3+Ae# z{3JBZPsumhpU;=)X;YN)%3kFwzOr9iev-lE`dJa-gTBuf^Jj9bvQr64z4SIleYI#vykRHQc}iLS9Zte`Y7RTeIO=S*Cj`=mUMC8XGqFkj9>M4S>h4&lgjLpS zXZ)_;gI{=rRn2~3HL~(J)3NJeqCQtkrj1f#;a2Vi)zvsY70I_VlyT&N_?l|c95$4e z;ESMryi6t_UAQO7i(Y3DZAGqPpImL)hgJ}mlNVxoG5{%4|GxzZ{n8@fqcwyy;0lWS zb_;)^1MLqEYcOg+a;Q=|;71#DP!plfYJ!}B6u?siC_O`B8g@)93KiX9Ad2_tK42{= z!L44v`OQkli7&7xaTk9Fh9^R+;EpUT?i60pKX5|Z!81~vcO!%7NVzL!>_)t!V#%5G z<8r*D<8Cb=HG>A@0?W&D(G&CmAI(;%Ddbr7m9$4WpvCC<&ARR!FNZN!8!o5PHf!g3 zR4y%LlJhGDJXo0n&x0rIMS)wv192N7X=7&wDu-_Q4+fe!$()r?8N2pZV~O#^ZEVg| zC))dvEp$t{pru5&oJZ=eB!Nx4FJ)m{rJZtWX(>BM#?z8ek`%*S6QZB!4V=_*k&$d25_+ZxE#NF@LN^KB#P>pdxcjSNULA)H)PUAE=!?Pj^*AU6_lbFs zw|)jn;k$5HMa1?{W^8~D`-t!jZ{ZeP%inl2W^fyvM3I6TgE&4kJ6P z9#0GX?KqZ~Mfd>Tf&EXe4F=?^dMhx;YZG`D^}DCNs@6(VQZGoaup?xy^hzskOz|>? zZiIFP+eLH67EMfwD;G%?+!QJsza;K$D7}B2QCjVwPgJLAr_4mNr2V(ENbiQt4t3Nh zKM2iL48K6u$eDRl)}GH{ZCIkDBRgm{E6C>}SMV^jf0r?NKW4q56zoDTv#G%6lkvXb zp!33c35_eBY&T$_N5!1b{VasuI;-yjJZM$0sUj0tm+k0TYY7sxuFdgGCqU75LfB7E zfiWlm2k~)q{6(-GxE69oQc@49^|N##8Hn$3HNNdczms?a+V-v11_QPg1B2-Nr#l4@@my5zf~B!BBkN~&@Vs;_i>JC@*I7o9^o6MH%Lbz zP@E={yU9B&*Xt5}6P^=Dv|uZ>a#)74oKHux$1e3xO}GBC(%DDtBEh@SWzn-~Y9`hV zbqRKgObQ)x>Ujr^-}HS(2kpIC$@1&3?TCMul|{c{x>_f>q&y3m<4MvJc&#cSJ8r5J z%Tq&nw+xdXm$PG%+73Jri56rmyu{h@ci;0M(7+Kiir%m~Zm#xZrti7fhYG;6a)K@C z3YMj)7@}ojzGKVcL`(;nkSkVDtcz{y1;7^W@|A*CVm8@H98wQ8* zH8+6yUPRJD?O%$NLg(c}MYzkW@Kw-(l$Shls`v=r<*#st>p)s2!GnE{4q^swh2B8f z6iod!psT3Eo3SQRc}%$ZX+CW7V0;N#2FG(JY`w|Hmhts0r`k?guG}%W-Zq#mls|Af zm=JnuJy1^T0ldrFP;Xb1Ut2Hqk#48pwD6SBcmKU;``Fcq?_x`ZhlMiQhnyGIB0aml z3|ZNu4Fzu`tG~Xr$=RqJR=Pv8T7$LV>*eH9W_cB~bq#rGR)C(6RK?HdLdmojn{=C^ z+sc92=WlVOct_k%7O>=G9X1kwp%nUIE^Z-fpl(TtN&i2Rh)HUbI0e}0JIt$%v9G2N zd5^4sb?5;y!u8Y9S0m<&@Kzj6l8YWGEIguD@J@ONooQW~iVQ|_z$(^>=)k{fLpv}Z zKK5qlZ!-s>dDDMmU^mBS-w3TvhY5>fWU2Ke6q@alxUXRn~Lmg>h4A zhpDZR;p!jtoz99-$*>%Jm+p4@=FyAsJ0ro^jcMwJvIdvxLySDoajeq5Yh}DL?pFU& zJL;?eepn04dQZ8wR*zN1?u+Tl8)c1Jk`-kQiA;vFPApcc%7!!SWTtJ&7wBF6P~s1x z+c2Zw7w6C|z&Be%=letSLk~spt!E&Ek@ve2nU^8#1iXm^rkcoJX$HJ%KJ)_RVxGl3 z1XrK{ML0@Ikmf>=jYg{AT=6tI)7-*b+7O!RYNVo27aVI&)RRJRX8y$aZiBsbO=wPb z7HN-9us^me-6_@t_mhE5K^pHDewO1NBdf6&V2x4%Sn*T5@$6tOev-=KX*Lc0LuorrG{n-Fal7w~5b`0PAd1%0`m!5oXE!3K6pYmQY#^DBSI7tosy zrbndCN&_Cm)`8S)o>C24pDQvMh~Z2)uO5=_?0=XYivyP{gZX9{kijls{?C$!(2O<^ zRjAnF;BL>4JPdV6NuCft3YZN>8wYUx290#;lNmW<+;;hEQyO z%_6Kqms=Vcbyc9f=q}uZCVLq2q31xYQk>osmkGDYe%}!>7ma5@(i-#BdZYNT)7nTNHo)Ki{_T{%y|S*KUh@!v47{UkZ$ ziMa1K3fI8{T;_R@%1Kx^bSVQUvX{_t-(;oGqaPzmbx{`Y1TH%G)&KM@AS(P9kLgfMtxZsqQwh20 zJQ{)$W*RuC0;n_pv06|F45T9MjBf2O{GL|OUC>`#M6ziC=#yIV>ZF#Cm!yLi^A=`) zZ0X@u*h*|v_$I9)oA?nni0uIeo{8*Yqos-R8!3;J0L0^f6jWmM3DQM1XjZn5M6)H9 zh)U7=p+ABdomE;oy|y}Cou|LoN6R;zBIeYJ$T*7@KQ+9!?>atbrx392dRGz?YX zV`PFJAg6o`Td`{TTy(7OeVNgp6+;Tv2513t13@VyG!QR{)k$N_rqk&uO!f}?CAbd7 z$#8a75-!mPbU9A#EU_*npy!au+=_RmcaeM4X2>h z&FEmnE3>6_@>e;z{0%eoTw0D-U}d3LAIAoX$KVjEz_-!Q;y0vlTC4#X!pp%CkWzey zZ6GJn!S}~WxdlWOJBED~fb9PX9aIMBfvXC8eE;9+V_QvD%&4=FI21t6>IC1*m{X*o z59k$g!T$i0w-;U2KCz8(ns!A>%OGM2ec--~2pRF;$pMaf1)j}IAr&~l%&e%e6zMS~ z$U?YYx?rE&HFyPHkj6AS)O0tQOv?iqZqCj~1%S6-Wj*K&aXHI^pHuUNe26#-dhOl# zQ;g#?cxk1xv{_mSUh9im57rfTOy0#sBRD(iSN3lR)fFLCMc~@GZmwt z`x5ul+PKc4L2=y^&&3yyObpbscR1^m|DZGwjE!beq)}*0q>*VD;}sVZMj5tV>LwRv z-B=;%x^$V{r=M73vH|$tda{7VlUDQva$^qgUYKMg^j`aEStNzLC8vZJbPRZdGQx8msyW$(mkz}AKmKl{uuQ?W15M#KO?y$lrTspM&E%tG^%;ub zW`R7$d}FkkN*k=l1s4ZdI8zu~GZbdt;5npmbSay`{|Alz9CDNt;iKtqVn*STxSOXH zH`3n7WnBmr%P!m!Tj4M%0c~_{IvEa&9qg0vmNf@k)fbHHKp@lW#oV}$N#4MgEZv8%ct5RB*KI#LnaNWW6z zR-&g_h+cXwlh`eExKF`zcSWuQoP*L0>eMbr)De-EQGi&W2z(oF!WR|2jIyK)JFk3WxXT-l}@_Y`@sH zt&VLQ9d~ToPRHr6V|HxYwr$M!=EuzRB%PP4d(YWeYwfk8lE$2mpBM9Q&`AH0)Db=X zcKMGAxf9zg{8(tmz<<0Sz#u-mpRp}xvvV5N(!cgJHbmE;N}fzrP=RkVo_w^|jKndt zt6g7hRGb_8nw^no=CAL8tMmfH-pjn%LMBX0qUb*?%PIV9RaUyw-0BJrAbCIplW=OE zkl!1K!)UOdQJ)rtqiQLpfU8_apSliTi&oUPMcBG}5+9*cpaoa(St$lT`x8|{4V_VS z(t*UDk~o4bW3T3Gb6Wes1|MQiaAwzbR~7cl76SqP!QAC*YN%r{u;>WEwIlJPZ|@YQ zyBX@41@u_EeJs%>d%MQsWz6Q0!n zv)={3+J4==>%5r*j)ry&DjG2-;#uUKnC!7bVz$IJimDQpDx?gURgC}h=xt2Jz6g5n z>-F}B?aJb==y^-MA#mBuLOw07w%GZpSi2J0_LwQUw0#+!$yX*yH<>Ot3dB=^e>CxW zl_^UtIZ*}R_mzf-xL3sEU7>iI`Sdd!Lw?|^wnfG(uP7jLh_*N_=cm&;AU$emDWz;&fxjv z__%A@CCKt)ye*uO-kWGvVge2aybq}o)jR$0gyT`wBRlvt^#ASu(f^(Q8BbmB1;4BT zH^Ym@l#Oc;H8mkB;%ll*kzYUxe|wh%H1Rv@Un{zEPn}-+QVQNUh8nz9jAkLp6eLs;YhriQ+T(zzIcq^ z`M{)}SKgj}?Sdi`yQuhoW9_K>@u@@Rp#Jsso#~&)FT}68ySUH1z*8}+qt8XXjPD*h zApNu0DdF{l&iYRad>xcMcy83!=r3Wx0d>9WeJlHfyBoVlx}xv^d~81Oo(<^!PxK+v z%^r7F<igL9yTU0-Jh6xDA6qa4t>y=)WH(_c#l~1_smE*1ND1Ryt6FM>H{#F$f z$6=^5;=~ZlRFy5qfeB257uZU5@I}5-=ao%FNGhK*`Sv!^$3hR(9pGUW$vrqcue47) zu{bf;q$_3HnZ2ERT?Z7r9rFUu&ELfT0;a!u>10O7R@e-5vcuKZLVFhmchkU(;#;hM zKX_^`x%a|~{po};b=t?tXyeiB-bJ(>?tS2m@|nks#fI?6h=QqZrs*GZJoZ*_pTG@4 zY5hj{o$~zcztD3v=w{Te@U{uNqc%oQPwf7wM$R#U_bSf5H%8zQQ3BD|K<#uj+b&2)_1&gf* zm?}CqD%R~XBW`(LVP~(3#bUMUE}!BS)Lnj1c|f$2sM0Efs)y@cc~#W(RvC3ETM|7g z>7-_fIu2_2kG+hjzm>?fP+fE?o2BHlo9d7~%h`sCXtjHwDc}?a%erZzondw-Pmt%O z-H?q{OYJXagzL4dnNKUv0>3WaV*Y77&pb{2FNCR>M{%>G_C&o1Z66*RG{(P^=eu8h zZ#}=i!rq5PM0|~Y7n3ovTTI5Nr%}hk(geK;e&_!(WPNb8uztZ`0%v(&IN5L}h+-SO z*ZtKg<%-k)xIVz|mbHJI(snyIx7w(FimPEJKiqVF-PkE*dN@m9*KX3`EKp0}?*o)q zB?0aDh1*vfIaK9gwlX!oOF?pMCQqvr}n$9Nw^`=?p0K9PT`;NEqVC!E*a*gkGL!o&zWzf;2} zmpcpCRS(~Ze$~AH`YjLf1b>K15;iWfThxZ=Vj)d~jt8#`J{jCG@U(YW@PmN-Ve#=< zV^>5z311ldE22rLiY_1cGoVLEx8On%zali+?(sg4aS69vh26RAS#HPG8eGb2$8c}{ z!F^+=eZ-EmqfqQ0)8EuNeyt3+)IqbFXTCvqN0S%I`NIBC6MZZ?#LC&+Gxte6a_R!e0;)!mmoI4UhgDl@WG3 zN8sC#GT|432Y4>|*6`eSdz^#btvFY;q{}F&D>2R1)2Tyu143^qxLfFTe6x3sG8s|v zIckP_X?I~R@}?S!%Je&Vcbj_3mI?5L*&RDTm+7s!#Y;hjloyD# z9K*K7we|*m6*ss5=csC}=9*Qgl|Af=+F%C2t`D{as=zb475)N!)oX4Ldv=^?`#6)$ z%kA4tjg4V*LPd9f*nl(682dkvn@-FTk8tO9wei;UZ1(r}`uZ*peiFPQc4K_?gl4g~ zVzxx=4v7hw7FgT&Owgi;Zb6S?bI1J^cPK0-&4e^pL&k;u3@#cN63{bren`V8?SI(Q z&*|i9=GjFr8s!Rh`Ff_IyF17+8I97RKvo0}N(TMHV@z!l|M_e@N zR2(=g{s20?`bRd#V`ZQmu0yHIny5If=&Wv{i=Bb;Vxz3Y?0Okh70#*xTS$tdARGoR z8A;DK%~?xEi_^FC7Zk&xx-TX#+D6Rl>B;1i(kGoyusfZ1iEq=OErC%HR`k@ki}8zM=EkKAsT{G_*X?cZ ze=DeDNROx&37O;0CcKU-5tAdLM@U@YT3iENfonpdLvpg6e4OtWeBhh7n!1CW$KJV4 zZuc>h8ke1LS29;~yAt1Mms0>f@D9EGW^jtOxOXHz*UkF6Ga22I(C?_gkK_7r0vC$A za8e6YYw*7`@}`Kw3E-9(jN{4@PF)Gvge@Th*l^Pdb!)hFhtoJ0Wo9X2$RoULwrhX( zSxtnWjb-oUKjbROn~T7KU^NVOC-qYo(!tElG($O9gdM1P$WLHbILRNN8)Q~0j9h2bY-Iz@C2S`JUOJTTt>->@lhLu2N}wod&y z)r;_wv3nz11nmguaWU5@~126L5J#e7N&0KaX5y)0uk1U8!TYXhTr&cG# zIpwksfQP%_zqOiSSJNrLrnfqi*vl|Oy+C0(2?bmntWW{o`gjn^KXn@BGD?^*-P10@ z8ykjVI13YFEAbGW$;SKYuI}a}imci^+bV3o-G`#&Pw0cP9>jn{h`CgV|75$JvwYPOcR?mO0(-C<6aB%-!)%5A2kxy`93W z0_|)F|J0C^Q5fGKHka$C@|$Tcj~O4i28?A6JD9q|rT&S-LKWeqa$PDjiN3NGbLl_D zPH{u5M03&=2U{hZF$3RAZNg7HDQ<)x^kwRX15B?}p>BOnXS+k^5Fd0(6bB(-+THa| zogPN4i!%skt*6X@w}-nrrYBKlpR%R-;##F9stI@-fC@NXJp&iH9D2P@Zg)bFTZ?|H z2Aat4Fo=a+iPPHbRIwZ4M%mF>Xxgz0>ptx9eb*14IssLK76%m%zZlmnwsJ&<(2vpi z@nCB1m)7rB@S8ACSTB4n%f-Hp$(QPN^gjRZ{%wPrgwzOI67)LYuJ@>Glc%cvz-9UL zwr`k;x|wqWeLRPCYGZw&T!N2fJj`IXAOvwDWRN+LN_@eSXtj-gr4CyFUY50_%HEqs^k%`54bPxl>tI!m@Ka+!PFLVPz8$o`Ciq}c^eF-6hS4UCK1p{SKpfZx znwH)+rWdoAeT|#Brj8~Zc;aXro&)eWOlh-;8t1#~dYRd&N;0u~9A(Bob_Q1^`vudl zFYOKZiFrLmJ@Y(U-CNvMd>00E_d6B&F1%KBsu*u{c%%rs68u-d?XcTHkAt&E7mRU7 zOp96&c|P=5s4J>j@CV<2g4>0q^)DAPD6l)qn5Ay^tef?o8TKIj?FPBpbAGRZ#{Ug| zx>B7c1K7Cn)kEFWK>wE4Y~^GztITPtsU4tJZBXqrl^I}9dZ@xGTJ(ffO)1-=Tx&oT zyA6i58CzC|GsE_g9Ce9pmc?)l71k)V%rw-}JOG8+j|0YDYSiv(Fq;{DWD#9a9OnFH zQ(xdy*y=(@`ObV}&g(Cnci zDlBl1=de!<4DU0Wt)I*(Zvln4VMn?Od%BttPJQ%b6P2H7D2s!ou2nw$WmXv3 z`)~+hDhZw%y+F^Jl0Dy;#-I^%%r#w)KVJi$H&7?`Eicq(s;;SKqU(|V>YSpt-HNj5 zo_=kvqA4tA7jnHd5A739Zl{^)&(4{@^au9Yb!H;tjJrob!_er^jIq;V4#qT$J`uG% zZb9V4fE1xALPS_-bej0AabLq4#ovzZ5qB-@UGRFQVE^^q=^N=k#9IS4@C;{ln(uhW zh01EZ-P^O?S%l86xn6-DBr^|g6er2cc-53PC|KyQ z)~m8`hnv|dK8Qavp580iZcnY$$xZ>^(hSAx9o-B5^&#5 zB|<%?vpcVTs>1e3Q-Q6TlhGNkg$w`9M9f;&PD+#4HPhTTJM2d&^h-Gvnc8XNdc$t( z^{#0A9%tL1oxS!X=YwaE&jgq7YZb6Cd~VQ;$j>b0&Drlci_hsp zUEVHcXQetALSzdteaWb$)E+SZrfjt9Wir@JdAixi+jr6bcfo&sv8ux?#V7hxL%iKX z1&aEa$zXP3GjF|6M2H!pKRr}^(MGq&k)eZ(V{SVdwqP@JTkWZ=EENexaG4vh1_u1K zz5;@Kl4}E^%Ue_RZ6?=rM2a^k3#cI$qa- zG7~>%G?PG`nQX}c+m)5~(FWJ1P}v1<#{MQb%B-WhC9~Uk%euDXiqYDvqNZMAhofsf?fmCfuE+KQ_ZXjd-Y@>g0!{|sj?ghFQ{Rv4 z6Eh~fL*&JJ_0N7B6^st&LN**_HNI! zD>@UL7beh|uA90lQ%gN?E~)2<_Z@jA2$-~FC&Ma{4|l5vY-`+rEBhH0t6r+_@-57F zOL(pMntg-lUuWXT@P-I`NzKHoIWzBXBImjbjsoe$O*|hzaQj{Cb~+62TL%5Cr!U-SaU-CfOde5tp%mGh_10dG)HSa_AFd#PSVmyW-mHbu;VsJ}x#hE0!d z9GfkndPI2KoY)g#4}!}2w()%!aNU2He_j7ip5N>&Za_scm~Q14(@1%7;eHDrKU6O? z_ti5dg(`t$_A$Xudp$zO+jG@Xr??)0>*q^TNSwg2_5xU`fwOui&(qa!6iev<%F0aE zVO2?Fvp%rzE(?3>e#2ZZR)d(kc*H(SA_`viKT)~%Ra-&1YKkkkw06)>)hSf3H(+TJ zsLFm3aogxhc(5(Pdvv*U(cxy%9l<5LtC_^oi`1!iIls?A5x#S8%2M}TwhNoJ2B&U2 z+-$}-u%p}8{Gsa7DL!P%si!&N%8kEtD-(tGbrrqsEA<3_vHIq&dj%V@8>21A?%rS* zN0ph2S>jOdApc<@rz7)6j*gCr9TAf;W>|dJ=;(;EVf|y1$8V3x7r82WYxt~)*TG4c z(X8$t&))3Yu4_K|ou^I;lzt^(b}!>%-`kVT{mhPJHl!vhrZVah(dG{(eu~SzOs=xg z9q(@R5T=FRq&DHN+RmI}YvNL>|2^WVE-Sx-npC4|-Ohfiw$>M_(Uc$tLvaW>D6)bP zt|rQU5EF2)YL9BAz8a^}s8GF7%~7e?g|Qn2%m|f1{??806+0m}shaQ%*|m}>*kFF1 zjSgGv32=-P?X@uGBeg@-9tIxc(QQzveKrl$R^5YYHIrSAZo%g1XnZ%$GMQCJ|FTyw zYv*>QKm)g){cIgzV;-5xuKs!(h*v3e+b`_Ycp>4|;oLE&^+tCNS1PtLmkP)gur;E5 z#KX8_akUd<+D`#jLO(^Pj+z^@Dr{S%Uqq6~bAhKrQw03y8|__yn)Q@-w`aD;AKlk( z>Emi5zv2`IuW7fW(-;FPScV-v@g{+Jm3T72Gu4_~wiL}sL6e*)a41oKhAOo?`@<5b zrsgtrGLoI4y-iZlQ|%Oah{`2oU2vFQY!CR4E~}tisn5~r7i9aWKau01D#xCyd$OOJ zAU>&_bX9reZaUtXM1!B~wK|LXb%e~y*3t*)k8-O9%y3SS3s7D};|-7uo$yN3hd0eW zYJIIj>_&JFeYID!*PMp4#^a?wpy%>$eKklL4CiYRkqk-|kx5DPd)Q?Yy*3k!J3r0PPNr?6h zsTgIY8XKNJJbB3GkRZQa{=3`*d`@|G_-%D>^HlWY^<2QwZl=q_Ug)H*PgKj{?sxiy ztDRHH3{Yw5Ri3JEMyfLGmrKw^_$*{FxteeNg>EuJ*0jEe{raV#Mj5+mbb{|c!m!rz)4PKDRS?5ZvvpPA96OrRSDkE&l*dEc?p_;BJ|RH`dSm&=G9DD}`5lQSsAMLwSF|q~Qi;0Ap#XR;$k9 zEPd4xdEbsz`}J2mf%}u8GKfwvPWx09Q2+i+tT$m-*c#M4vth3DqvboNMxnVZgHON^ zao(CP+@hBnu9tJiAL-Ims5`XRl;EzHvJ1(KGQb3jpUh&QU8VLcB!@G>HlFIhOMw$`krfCCW6k!^vRVE33)MND{oExg>Lp+%PHs>sHe{yFCT;X3W zvRp*osOfR@qf$rxh{_$^G-`X)%dkI!#soJFdK>i6d&(!9r@hnG6X2cbd)nR6r?96V zoN7Hi%6>||?`-}tXPvQNLpPZfP2B!HO4}xu9`Gx5VFkERi(46imj6A->3XvA6#VMn zu@U4W+;nIC7;L2pUFuis1>IE{>VQabKus4J@mq-oAzUL@i2#05cD0UsR}!{5oJrLN zOkdZKHSoyKOAlo;U9`nsEti_HqB+{_>)_vs9@%M$DQ&>Hmg9G~R?jx8RSK}&`|6v@ z$33aV>`PI!l_|_`K3i&C2sPYuJx|X?p^?;lRxR-w2t$`W*EIzlMq4}3{R*~VJW7qP zPF7U0Vd|M#hJr^p%k?sJt{F_Mvw{s7h0t!l^i2qu8F?ULZ}8IS;^8AgK1Cc3NgqBb z@?_X%oNfxS*=@V0pxbRP@@DZ4@Z0TE-4h6Ma~KDn&F(NKz1d8qG6l3UAIRwuZGmjZ zfE9n!x6Ej|K?fZmJ804KIw1J#WjG4p_4u$&XMbR4v0PlUcFR#Z3D0vP2=oB4m5G2s z@KlA_7!W7Yf@i%Jd%5FF=oR+!?>({hCvhN%_`;@p5{?EX+VUvw5mKvE0^Oz|zLUzaG|^=?DJCVXz(8;u5;tQ>cbEspWQQ zGoGI0J2x(gS%l~1K6|WA=7IqW2hJB3yYsdu~&>Oy%4K3(v zUztk!A^NyKOlvV;zA(3N+**Z308cXYg^kXKP|8<_P5j5{fNx75XOR7meyvA2SM*S{ zc2Ak!|4a?>5^O1+>8;G>CrT0@(7Ivd?A+=J6+wGD##7rh%YDQ*rGMYR4Iu%cc>{*} z9SEEh9?2H0E}kndwqx#!o%zydPpM{EvA38Izg^m~gKvH}F5rwE|0 zO0DPP9?**n01fntCutgfpjsx=CM zTJnxLs^*~rnqih{&HJ;dil;ccnBBZ%SLB9%<&K=ht7pEdh{~X_bKjNC>;T&t&fM!m zy9*vdt(W2{W8IXphRlO=vWh9{hP4s0A>=)#$*x&IWV)4p;yEBFwlr zKLeRuf2M1Io4CaX9Bk%_bEy96a91nvPZh;CYb|K?dNGy_p>;$E?xFLkohtD(5=?7( zTqT41o=?UKSJF&Z*@>ca(GGRuSNe-ryo2R(gia%tGXXM@6FS#)0*T5?E=xw8n@4Wb zQ`s||i#NW9+!OMhLc#DiTv(J` zYB#lu+dt7B-f{i{$C^aWw!p;eppd!g8l{JWI-N5&-Qi}xGs#olx2to>cLRFuL+&=d zDg2svTl(zx)_1=8WOwCrodvTw=bGW_f%EVY6bhZvr+eieS2uvg4K9W z=7^_@ov2=ecoqh;>!ngsbygsT6=cr;yXXM6y;#(NFWpS-pM{N#CBdx^vAr&gZ2?C` zF?4{HctSg^Ibt5uE4RR3Uy9Q*M$T~M7BggD>fKH7FV9f2rGXhQ%C5XVaw$APXMF($ zydS@k9Q{UZIZ%}2ZBE6@sTh+-@2y0St0pR=jH0VrBDa$1tD!#5r+#a%n!vyFm-bbu zRT$mN7&_DI=7gSSqRj%`%UQ=Q-{w4IX7m&ccv@2#?zSiW?jVyEZYI_~0kY7FY1W%? zAGuv8U8Bq`BkVd(Iy2I9+NUu!dv2F-Hn?ls%3Ir$#8t;r#J3U3&DO3%uB)b>r;>MG zpvyjHhI?Qxos9TZ_SWCTaqdSlGJj6p7_I$Modo>!3=y`!Jwmpo9+&d5R%GV3boI5+ zs~(e&MIV*SI?A)nFHVXuzKdI=5LfvBwZW^?iZYb9EF?frhey45VMJNNyi23xYYfpdV<@ zxm$(XK#=-q<}n%CLE&$x9#VNsvI9ZEwsDr1nu4~67(CfN%M3$()5^?*#Y&BP-faG+ zXq6sjvw-S^drMQM5#E{tdX_zm9;i6Vvk|T=bhOFAzwfxR;}6use&9@WPPvZaLU`CU z)cImQI=h@f{>98QkF>kG1MT##70xO5FsB`{F(O;U<_Wfb^YSM$|w z22ME|&0||o=4tw0s>EwBP^s~*&B@I4Hg5I=86>(}=*_9EF5t4TMEr|ibt`dNG^HZ= zL;OLe-wQq{`A-(>qVXs4siFtl1<^Vt zHD&N3`eN$xQ+GHI?VQeTcPV?bJyacZEw+1`i_U51Pxmb6F3!+%?O6K_9N;bTRID=% z=3=UujzXfCJu62@bwU*TC7E#tm{}B1bHQ1=~ zcrJEfMqq{9PCdShr`DR^pQjJPKLo%%^k$0NU#uent)rTq!%w>edi5`T!&NnrIiq+d zhHS8d`DMIe)eE*@71t@zE%~6d$p(T}7998~9Z600nBIlUo~ScB1)Uw7^(A(4`HSfs zk2>bsrVlb1sqN;>(F}F2qwdV$9K+plv|UVhbbaJcPE-H6Y8!uNH#&maPF36>9^q*J z&^d3;xX0O5$V_iJrLS!1N@Ci`XDGq4={e2-Ca%BQGpJCjGWp}^7bqUCqI?>oCWBXQ zqTksJhB6gTnl^GO8j+RqzPx}N@MGAMb25zFFGN3h)p*$lJ^Oa}{~aPJk@dGq$`eQNv9UV0Qtz*vW{E^4)YgWji&eeu0NSD`?MJ*Q=_VVjicdUqW2H^8BVq#_*Op{ zg<_nTiPQ)gRBv$N)6Nh*UuS3MSaKy@Vf@W;;J5Qp7B#SkfX>I-ZDE?{gNVIX_1L50 zug9R8xDOw8OMWuXor*f6-4IWwwy4r~s#$u6$qiCI*d8Xw**$RlDulw%vGJudHJN_w zL0_rSR>=>bf~{6UO-Ax{xWld`p` zD2R4Zu%{txYN{n($#ZC1R?#1v;_vva+_Ef6_5upO0N!huDxj)4Zrw>*R=;GN5W5NxbVVk zKdfq&QaSI_lhO7cB5Rce^Ixy-81@~}rB*^i`9j@+F&YcD)L*>A1=wFSqbjdNRG27l z!0<(}YpI!x0VgSmIyi9y(=y!Gs#=fG25iv9tgcoADu5J3g;mtOD9_=;!eLNG(lLaf z$>;`-l1rUeYxE|(hRcy73xZP*XF|OwnXwg4Mvs#kE~le;Lp(Zw z%Hx?G1%|O%Zbdh=QMcD;@tRwxUQ%DRH-l9V-cA`DN^9F=(f3Kayb0ypJuop&E9YM( zeHS`))fXz;KTVVwg9h+VHPm#m>#84cr&Dl!_)p*B8@NqQ{YeinWl^u?pfj1EM%WuT zADy&^T>#xd2ZGskIhO2FjpsWbOzJ5b%5Ly}kJxlqU*xu4bKBdqD{QbBV4V}Ysj_~7 zXK!WNvZjbZvD;i%Bj1fS!|7ztFvqev(KirubpiG3d${SWumlT1cCPAh6dS#$H?rW} z_%E^hZ<$Ti;OzF6t4%&?-yh-ub>3p|mj=2wH{&SJd^p|gYFLKbst}R%71&s2S&Nyj zp+u9hij_EK2#CTD-qb_G}Snwlws7sr4uIhJC0xa73wV zKhhPz!6t#yDiZ`V_rjzjvzL%Z;cTn0hpU3QOwAXfhZv=QQ2Q59dzc6e;=Vj0|JH(u zPA|U`9~!6-G1;_4&oG(Z{%@BqU;>bQWyDF z{>?e+AycV3Oluwi8y^KTc3WpsrA23I-x}gN+;?Vq8s+wUxeBGn7&*&MiW5!&HJ9$B znif3g-#phvM3{2mFu|rE`Jta4L9I5Hj-s_bu6rp>1<;zQD60j3!%U(E=;=(4sx1hV9U_GT0I6=SFU1k+sK?CoKKT)Wz2P1IMRJQ_09Am~S z^u3(0-<-;WGDJ^8MYs~2FG7q}<=9JBoF_H~WU+v{gJVW1e2M3a?7V>2X`H6d*W_mI*gk*LLN{@%r#~3hrP@lKh58g1U%THKFFsQ$=+%Qx{mV1`oVgU zJk6Qv&C`C(R;0!HCaBE;vy#dBb~u){FrAs(%Al^()87Imy~A{fQeOSt9fA{WW|W65 z)J+v>`>Wq}EBd+9^0=PF?(pnr(I4vZYOUF%_QHHj!1MSUo#`dD5;XM`dnd-ye`cYE ze+^$!7B8x9Vk4@P#OnW~sEdlKEgFjwCI$FadS(D>vnjM2_wlDlCC7*b)=AWCeTCO# zVS?qbII1@3H|!u@j~??C*|01e&3=`ix-3v%H`Qeu@j{nle_KK8BN#v%X10jTRAkpx zI=awVVxdY##au#0!qhZk<`B)h?xY0WltwYzSWW_QZ>mrA zp!{W3e5pF1T=NH+J0_EJPF8}Ve3MsHoa{>P6NCq7IsTrdRQhFzc6XQxKF9`!lDJs) zz{m13C$F^i%=$^~FqB9)r%_ci2MNlH{@f?EQG|mW4wWnD z&zjNG6$R<)tapl$sFQw!x{CbSntgG3*r9Wu6S`e}<;G6crK#{LfdB=89c(qp zh}&0{K+{faVD<Mcm?cf51D9?^@$3nrnI;}`-#pA#XXS{7GR)k zVNKzw@4z`sh=y`0jP_KfEWa>sxmpaPSE^#2(pPb3AB}TZAiY^*p29|Xi@NC^&+jFk z4jpAWn1Td0HVu&H6Y)OYV+57je5#Q*|DT3Q%O=fJV!Pd&+_#b^vry-RahlJR+*awJ z82C?IrWQIXUu%D`$iDKCT?`Gk&_F^xiBHyz!}q!&yP`!ztff3PVpF* zqT4W%`BC)dp!yz0%)EhSCXV{#3~2RO;@Sm$0B&L~jPQ7s)$x_>VBh!Pq&|o_p7c0Y z7vwhOw!U#PoA8;RvmZPU`+}+vF$>`XdIBWBqp++S%%p}`uVf}2Y(0Q0a5I6KpX|Ss zH&UH>!Y0hQ*X3QTQ9H=tV^s#>L)Nk08ri@X{TYR69QU-MdIN`kM5W`557w!8D!%ARBGgHG z&QQ?sztl<7TECJP_~&l=Kl2^`l)v$S42I9^t#Wf0f}KWYEiNGW(aqhbnZ>=V zL-l`MRpiVrrG~s|!gxA$)C{6(4E54jy-t2qZ-rF-K0sP156DIG4;*iHP=Bme zQRqop%AM*L-=Q7<8^kU8Di=`)H)k_O9(jPz_7XI;uByv<>P~gL1uQZ^PE}jjMwmf3 zsJd3bsxLsTageIZr6;Op%yu*v)j1b}TQQD0_&6MJH{!rZah&?&tj^CS*{1TeOyuD< z@;l#jb+bs8&|Pu%46&7tQDb$a#6L?`H@<9stDryPP+pa)JFPlkZ~zzY`MvgXAL`o~ zDuw)_`XrudV#a%=$xLVI!E36fGMmOE^%`5Bk`=Z zye&?l19XX8@-*H0EYTQ!|0uOc_)|yygA!mKOi4OXkNp3OGxtKCvF?F9-RCI|K=J#I zI*3Tm9Pw;<0zFm_D%9fOUT3Kb_Nn7+(Ds#~CJhKmY4w?>xRKu-jGE&X7|2ti!$9p% z-&>hK|B`dOPAp>w)HBr^ZEP1R(K*a1)I#I-21RUr=Cg~ipZq!fZz^4k_m2A;`?qs3 zHQvOe00rwOD-!Mg#@VF}8vVmE11Ibu6(>w1d3ib$jH&URn@tA0W=4?R5;w*dr!$_w zyN!@pRWs8=7nYaJD5gSptDSlR>``9+Y-e!Fq)ecE)`yAk+j$~I6t2KTfcn(a%V1eb z>IR~q>WO;lDBNjVQC+sz;AMfk16cF{<;QKx40D%B=cm?g&3Veo{~tgOD#QNaH*9+B0^*cchS0?p zBWp)<@0*}FyiL8eTNRWI^ce2OaX8tjI1-G8)$RsX)B(VS@eyusA@Wj7e8!G|bN7bLWgj*Au}M^O zTTwxzL6cjG4nHLoa$5aCwV^63pxUD9Z9(@v)UM6D+DlzfPOY&ni#h5GZ($fZ%iMH< zML03_%shPxj$pot7L|277*#)1eFw?r+2QvpSr5og<>>R9TMv20snJtR0A)?W`I`ur z|4i(IW9>-{oJ6GAAZAhZMWZm=#Z6tz+~ssM#+R7B{6>d5mCTz{6#?g(r2F9JR9HM= z)}^*iO&(1v5Az;cp)B|eOEVUI@ex&CkC98Q&$6~UgZsm1ri^NEp5O4Sn&S!Q;j<^m z5-OdRsEHPV91fG?!D1qHDLGT;f#v=M2Q*wIB?h!le2etI>0~lp2&H{6Nc|>U(6bY7 z#uN46Yf)_dlK1prFfSLm=e+8w#}T9P`j&S z0-5eN{ACIhXrs&zHG+Ko84TqIs?_>?-tlz)?c@U{P)>1H2U0afbE9vf{!hmf8cfBr zj@VIA^s(Ns>)HnO+(X>xih^yg{A4}m20L`+CB-dOi!P-&J?9tLm1{aDosx$W+LUKn z93*fY$jt=0+9PB!e=@h>(<<~7{kScKnMk}tew@nBy2MXL{h{-TSt^~JMz@_7-S=W* z%u=eLin0?=e4A>>iGE2`P5h^;oasf}{u@-_W9Z=1gXX;8v+olbz*L^|#0T3EASW|H zKF9{3TB&$iMLF?<=>=1nRDAmloX8*AMei1l!$v8U2`yQ3_S8-RIT%8Bb4pw2qN_7h`URunwC?q)a7)XCi|R4<(mNiKUk!}Z!xp@ z6AU@2*bg(ZSd2l%niSM!KN!m=(L%+JE#4SzD_g(z|On#1-*@DlQ6@-WVV6r?j+(%7Yu$W%DJ^5%XHEe|1M?4-###+pc zPlA(XQtG!fV7cXqS`jh_y>K+sT}$N|5Ti+)$Qn#1J%NvCr4oHMZ<>WLz$k>k#IF*~ zGs>4bFK#81nQ)${s>}Rz$p!Uiko&u^z$d9_8;B`zNLk75Z|Fn!Qf*D8!)mG;l7X3r zU=m`I%uMYz97eMPJwiBK{57`u>;~bjs$Y}yuc=Jp5KlE9nu$2@iLTaJ5zNh6?5p|JU8K@Vd z1OG|}eXTNpY2V`>2M~SM5Ha8KZ>*K&`QL&l`pc_-=>_X5m+HtVk6{m`zphAseoEDo z#r5B67rJwWR`(Dc{xPwO6TIE*L@l+CF1~?E!CZ4Iou3$yTQ-94xd`@mNIv82bfYfW zC}zvV`}Y(l8V6iEJ@?h&d1fOvl@y;*_*Q3Xy)U`sFYa(7tA{AV^hHO${WRFRq@oI4 z>;!te&AKYLItjh}3v$YTI*d>EjHn-gLhuZqCA~}vcAr`n;q0D*tE#W7bGk;Vg{T9H z!!Ok5KRbyiJvfVfIH!-$VB`XUNF`@8$#_%u1wkw;_cB zZsN4FrBA-%&K9TsTgI<$gX`Pv8t*Hf{i}QL7y>2Gn-eYjQi`<2|Wa=~IHYS{OE)@^E)|``zyBP}U=5iD@ z)I2c2r<}?*!L_z?VwIQC-M+U zQlkV4;puMz=^81w6G1QOW5ld3Xx7fk;hf5W+?<=#25n_>dXLpIo<86Met~Jk1?#;W z!uIUVp!ZAF9=iCWswfP?4KI8atIGv!^BuouxCUYG5uGG59;%2Yk^+B z0}tz~j}fzTke90wxAy9FM6086x=N`c>B$n6%odd`d-_DY_9G?^FaxYJsw?k)lKc5d=dfoke;X!OpY8ND^M9HLACdrJpV!;qw`p&TQCoKl?YXpzGV@SpaP%m z60F;w#G}XDpv=^oSw&kpi_AVs%+x#i8~;UXU5>nXkqtn{*%g`<%=0XB>$Sj82E&^r zqlV23wt85!10hXD-Ps5%HNg65ZL_}W2r_4NYVMpmC))MS`Z|^29s%zIgELV)meu&o zB|r;Ps0+lmq4FHFM7Pvnlb2e3CujXHYUq?apEcy7^f0~osJrXo1h-qB6$8N8TxjW* zp%KWS3+mxyo8h27-%MULS+3QFEZY^#?UD)uIscDM23_gs*Wn0fNiC@s$lN@`LR5~h%y219 ztiE)WtF0C&)jTr6nq=K$vgNnfE7pooc);ZBy$BKq@Lw%sMyb+N@~emkm)R_M3w1?e zUm&R=R+2B8p~y@@opT7(u(_OuH`8f$Ixgc=PUJZjr|Zl~#*gL>?Mshd{J)4WtjByaU`!J^E4)eo#3?81e18`b@7fl$%!BWRe+WE7ZK(Kn^o-K7&x} zGodot{U*v+7qh=P}z)RQ}IFK z>tDi`Z+laIu-;qW!Q|FxstXX<1L)~zpbaUdvy%0}uH_?6-Agr4_{(TeykOAR`kc>m zbVd=J>{Ie0aj_*%r>}V{1yy-Th&TAK@UoQDx)?%iE@F@$Czud`Js+ib?|A z#2MY2I2_DW%56E;+9bNkGI*q&lh>^2V6GWZQH0ayEat9%v<`w1OhmhOn_8q1pLe93 zF6Mx5v6ofNAse)#D=0>U?WP?tuDiUGqu|DG!AT~eTggpry-7b;s9C`))2Uxz{QYGk zFsE(QF3G8Bl2QLHLwj6Je*p*VO-DVJ3gQQjjNro{EX7q7W@KB?m3<&XpX6!X2BErw znq#?~Nf%Q`{=?nCl}GgB{f`F?o`EiT6z5?(ab|`n$W!bM68oAA6Hc_KL?`$JTqcxV zC>_8hU#pL*4bBG#^jDtxUCnF=Z~q8WW|_g_(r^n0$hmqv9nxYVSXyFACt^lkfwL#^ zbs8N;S*p+y)J&bJV3v|48j8}!jq_h~GSM^Q>Og9!Jbb?G{Nxv~Ehp*TGx82siKW&X zYW?(_!DPH+A8`yt$|jK?9YG52%5^x?2k@U$sPi*X@i=hUHB?n@Wo?a20g?eD9=q;zi#+St9pq%PT zU0eg@VNK4(sl=K@)FMI^M1e3%KBES&Ni}kW2p+_JxdAg)1vPzZs*sOl_v7GT38o>4 z(O-ukkWT(A75}bCUP!k$^zCq z>ojk?hPZ9r6)$+UwXJ_(3msUK8~6tNMO;q>&NkHi(x>GR>V=7#?Yc6XsfRwR8W{6= zzH^XxqTO_*Wrza@IRkHqK7CPpb|&K#XX;&ZFW83-=Yz%)y}K{9)(SA{thzkiAH4fuYE5I()CDtB5FXOMfk!Q+LTL+3axNa1n$~g|&d4Tj^2=;cE=8fo>2Fi}a-9PATs)Oq91Q#U|Q(si%d~5?Z>BPItVXd>K zQ3qZGQxzf!CoGd}MOF>xS5|?(_{mQwuLd!9aYmIhA=IJch|ll1k;$oI>(k%uR`cmp zc5(ui!D4+P!xu+caf__gShiN1z`Sap7zP~$8BLEa?kq@DOS&CD7|JQ?BvT!)z*YxS zH)T_;VI@ZKC(1K%^jddDBV3r=ew6BbE3xP!8m+e=@l|*#OoR$AEK6fBr!}xZ9+?Gh zB%T=EMD#}2krPBg$tQF|ec+4-5_2@AwVxM`a&ys<&z!JYF?)^a?DolU9 z5aezyx3LiCB{!c&GC{eRZGq!>NAtlK%5htJqGPWmYH(Wn2w%>b03A9EGC!D#W*;aB zIJzEb2A~bfj4m}0mB$YF{BU{>G8LKOyU3=C!vx;oGaZCee58KD%7AI_j3h zt~Dk1X@*Ke=ebnH5uY2Prs^o)a*sai9q7m1%%Z$fe{s8>a5LXho#&>4P1G&UNvxKM ztBvUN29nnXk(E1Jhpo}v_|atfiBx-jbX~W&3*|&rqVP7V+^c-X-Lkv2m@c{-UCqBJ z|08t~_~L9R%+IJ2b^sl43c9L5IRn+r818=t)CV_Ef6`EjS6&xm53Tm6fTj}rMIYFo`AKzM9td z(;Sb`Nvu|T$>p_S4l;ob)S!ZFjBc?O-R)aFP<`aH1fkG+#1uh2)fNoxEIt9%sjXJ2 zu5uW7phH)31Z27_r*4AIf$}Ch)1U$ei3OnPzI?JDA{p@{9JQVwHCI8@NR9X;=jBsX zfn2;3?Mw-oikp8JzGDySofBm0OS&bh<>vU&&bRi$0vE(huAb>lUDuu)J&=m#66a!* zc&tiN8Lp)}%ENrB#!ImY{b+NZ`X1{bXThIJ|2v344YWIG*3hfw!p~|sr>wU)Yfb$> zo*je&+m=ykIj(j>r{SAU-j(- z7Lt>D5z$w3HfvLF?KZj4%1)-9;bfz=9Ay1~Wh+JuxQzd6`~Pn*2(S)|kz%b0BO4v0 zXBz~5RiA1nA82Dd&-sMTLlu)*O_GaXzQ=;UrX$|AQmN!g{g`;QozEFbZtt z#8XM!i#7{ow!!`G9f*E0Zu?5pjhj?Ty&?HIc*v@z$5p9 zuWT|>&_Vi{Lb-`P3(cyFsTX5n| zPbTO9J{W?(!6$0wBVZ7UJAP1oKu6Ms-@B(f>*jd)Kc{9spc<0{^O9MnhzHb!3%Ti! zQKIff(UV3e=Z*g>`@jzQ5JPi{5k#6;BJf74sz9*lG1hM?k0!Ao}HA#ei*<^o9lOnRi5FlK*(3*MsgY@-%% zB0CbrFL2^Qm<3@6A9a21X<)IGv?8z^F6 z&{v|DUqio>5jEL + + + + + + + + + + + + + + + + + + ImageJ + 1.54f + + + + + + + Compression + Uncompressed + + + + + + + Unit + \u00B5m + + + + + + + max + 6440.0 + + + + + + + XResolution + 11.299435 + + + + + + + min + 1582.0 + + + + + + + ResolutionUnit + None + + + + + + + NewSubfileType + 0 + + + + + + + ImageWidth + 171 + + + + + + + MetaMorph + no + + + + + + + MetaDataPhotometricInterpretation + Monochrome + + + + + + + hyperstack + true + + + + + + + BitsPerSample + 16 + + + + + + + loop + false + + + + + + + ImageLength + 196 + + + + + + + NumberOfChannels + 1 + + + + + + + YResolution + 11.299435 + + + + + + + SamplesPerPixel + 1 + + + + + + + PhotometricInterpretation + BlackIsZero + + + + + + + Color mode + composite + + + + + \ No newline at end of file diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_hdf5.h5 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_hdf5.h5 new file mode 100644 index 0000000000000000000000000000000000000000..0b98871640da2e2d8a7948d2d0a3a7a1184f6678 GIT binary patch literal 1092663 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�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

CBU7Z9&2{t@FBuThTb036_7kKx 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

`r^w_I1DrdWpC&;*4!S+-bLEw5Wjb!pf)*c4l+ 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 z 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 z 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

^Ep2(XNPh9Q1Yu~H%P9YI}h$VN{q847LcEC-q* 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

m5;w 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

g7WpNPyLqL`|KePL{!MPq2 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 z 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

^KgQ_c?IGFnC^z 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

ZyyDNg7L~D?8To&L^s?AZXbH9@umDCs~9` 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 + + . + + + mitosis_small_hdf5.h5 + / + + + + 0 + channel 1 + 171 196 5 + + µm + 0.08850000022125 0.08850000022125 1.0 + + + 1 + + + + 1 + channel 2 + 171 196 5 + + µm + 0.08850000022125 0.08850000022125 1.0 + + + 2 + + + + + 1 + 1 + + + 2 + 2 + + + + + 0 + 1 + + + + + + 0.08850000022125 0.0 0.0 0.0 0.0 0.08850000022125 0.0 0.0 0.0 0.0 1.0 0.0 + + + + + 0.08850000022125 0.0 0.0 0.0 0.0 0.08850000022125 0.0 0.0 0.0 0.0 1.0 0.0 + + + + + 0.08850000022125 0.0 0.0 0.0 0.0 0.08850000022125 0.0 0.0 0.0 0.0 1.0 0.0 + + + + + 0.08850000022125 0.0 0.0 0.0 0.0 0.08850000022125 0.0 0.0 0.0 0.0 1.0 0.0 + + + + \ No newline at end of file diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/attributes.json b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/attributes.json new file mode 100644 index 000000000..c5ca258e6 --- /dev/null +++ b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/attributes.json @@ -0,0 +1 @@ +{"n5":"2.5.1"} \ No newline at end of file diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/attributes.json b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/attributes.json new file mode 100644 index 000000000..648bcfb84 --- /dev/null +++ b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/attributes.json @@ -0,0 +1 @@ +{"downsamplingFactors":[[1,1,1]],"dataType":"uint16"} \ No newline at end of file diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/timepoint0/attributes.json b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/timepoint0/attributes.json new file mode 100644 index 000000000..fbab9f5fb --- /dev/null +++ b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/timepoint0/attributes.json @@ -0,0 +1 @@ +{"resolution":[0.08850000022125,0.08850000022125,1.0],"multiScale":true} \ No newline at end of file diff --git a/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/timepoint0/s0/0/0/0 b/src/test/resources/org/mastodon/mamut/io/loader/mitosis_small_n5.n5/setup0/timepoint0/s0/0/0/0 new file mode 100644 index 0000000000000000000000000000000000000000..83878002397e3718c305c8bbbc267cc853566e65 GIT binary patch literal 173646 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 z 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