Search in sources :

Example 1 with QuPathExtension

use of qupath.lib.gui.extensions.QuPathExtension in project qupath by qupath.

the class QuPathGUI method refreshExtensions.

/**
 * Check the extensions directory, loading any new extensions found there.
 * @param showNotification if true, display a notification if a new extension has been loaded
 */
public void refreshExtensions(final boolean showNotification) {
    boolean initializing = initializingMenus.get();
    initializingMenus.set(true);
    // Refresh the extensions
    extensionClassLoader.refresh();
    extensionLoader.reload();
    // Sort the extensions by name, to ensure predictable loading order
    // (also, menus are in a better order if ImageJ extension installed before OpenCV extension)
    List<QuPathExtension> extensions = new ArrayList<>();
    Iterator<QuPathExtension> iterator = extensionLoader.iterator();
    while (iterator.hasNext()) {
        try {
            extensions.add(iterator.next());
        } catch (Throwable e) {
            if (getStage() != null && getStage().isShowing()) {
                Dialogs.showErrorMessage("Extension error", "Error loading extension - check 'View -> Show log' for details.");
            }
            logger.error(e.getLocalizedMessage(), e);
        }
    }
    Collections.sort(extensions, Comparator.comparing(QuPathExtension::getName));
    Version qupathVersion = getVersion();
    for (QuPathExtension extension : extensions) {
        if (!loadedExtensions.containsKey(extension.getClass())) {
            Version version = extension.getVersion();
            try {
                long startTime = System.currentTimeMillis();
                extension.installExtension(this);
                long endTime = System.currentTimeMillis();
                logger.info("Loaded extension {} ({} ms)", extension.getName(), endTime - startTime);
                if (version != null)
                    logger.debug("{} was written for QuPath {}", extension.getName(), version);
                else
                    logger.debug("{} does not report a compatible QuPath version", extension.getName());
                loadedExtensions.put(extension.getClass(), extension);
                if (showNotification)
                    Dialogs.showInfoNotification("Extension loaded", extension.getName());
            } catch (Exception | LinkageError e) {
                String message = "Unable to load " + extension.getName();
                if (showNotification)
                    Dialogs.showErrorNotification("Extension error", message);
                logger.error("Error loading extension " + extension + ": " + e.getLocalizedMessage(), e);
                if (!Objects.equals(qupathVersion, version)) {
                    if (version == null)
                        logger.warn("QuPath version for which the '{}' was written is unknown!", extension.getName());
                    else if (version.equals(qupathVersion))
                        logger.warn("'{}' reports that it is compatible with the current QuPath version {}", extension.getName(), qupathVersion);
                    else
                        logger.warn("'{}' was written for QuPath {} but current version is {}", extension.getName(), version, qupathVersion);
                }
                try {
                    logger.error("It is recommended that you delete {} and restart QuPath", URLDecoder.decode(extension.getClass().getProtectionDomain().getCodeSource().getLocation().toExternalForm(), StandardCharsets.UTF_8));
                } catch (Exception e2) {
                    logger.debug("Error finding code source " + e2.getLocalizedMessage(), e2);
                }
                defaultActions.SHOW_LOG.handle(null);
            }
        }
    }
    // Set the ImageServer to also look on the same search path
    List<ImageServerBuilder<?>> serverBuildersBefore = ImageServerProvider.getInstalledImageServerBuilders();
    ImageServerProvider.setServiceLoader(ServiceLoader.load(ImageServerBuilder.class, extensionClassLoader));
    if (showNotification) {
        // A bit convoluted... but try to show new servers that have been loaded by comparing with the past
        List<String> serverBuilders = serverBuildersBefore.stream().map(s -> s.getName()).collect(Collectors.toList());
        List<String> serverBuildersUpdated = ImageServerProvider.getInstalledImageServerBuilders().stream().map(s -> s.getName()).collect(Collectors.toList());
        serverBuildersUpdated.removeAll(serverBuilders);
        for (String builderName : serverBuildersUpdated) {
            Dialogs.showInfoNotification("Image server loaded", builderName);
        }
    }
    initializingMenus.set(initializing);
}
Also used : Change(javafx.collections.ListChangeListener.Change) PathObjectHierarchyView(qupath.lib.gui.panes.PathObjectHierarchyView) SelectedMeasurementTableView(qupath.lib.gui.panes.SelectedMeasurementTableView) Version(qupath.lib.common.Version) ProjectBrowser(qupath.lib.gui.panes.ProjectBrowser) ListChangeListener(javafx.collections.ListChangeListener) Map(java.util.Map) Path(java.nio.file.Path) ReleaseVersion(qupath.lib.gui.extensions.UpdateChecker.ReleaseVersion) Rectangle2D(javafx.geometry.Rectangle2D) PathObjects(qupath.lib.objects.PathObjects) Rectangle(javafx.scene.shape.Rectangle) BooleanProperty(javafx.beans.property.BooleanProperty) Project(qupath.lib.projects.Project) ObservableList(javafx.collections.ObservableList) Divider(javafx.scene.control.SplitPane.Divider) QuPathExtension(qupath.lib.gui.extensions.QuPathExtension) ByteArrayOutputStream(java.io.ByteArrayOutputStream) FXCollections(javafx.collections.FXCollections) PathIcons(qupath.lib.gui.tools.IconFactory.PathIcons) PathObjectHierarchy(qupath.lib.objects.hierarchy.PathObjectHierarchy) Bindings(javafx.beans.binding.Bindings) LinkedHashMap(java.util.LinkedHashMap) TreeTableView(javafx.scene.control.TreeTableView) PreferencePane(qupath.lib.gui.panes.PreferencePane) Commands(qupath.lib.gui.commands.Commands) QuPathStyleManager(qupath.lib.gui.prefs.QuPathStyleManager) IOException(java.io.IOException) OverlayOptions(qupath.lib.gui.viewer.OverlayOptions) Preferences(java.util.prefs.Preferences) ROI(qupath.lib.roi.interfaces.ROI) PathTools(qupath.lib.gui.viewer.tools.PathTools) ParameterPanelFX(qupath.lib.gui.dialogs.ParameterPanelFX) DragDropImportListener(qupath.lib.gui.viewer.DragDropImportListener) ImageView(javafx.scene.image.ImageView) TMAGrid(qupath.lib.objects.hierarchy.TMAGrid) Image(javafx.scene.image.Image) PathIO(qupath.lib.io.PathIO) EventHandler(javafx.event.EventHandler) ImageServer(qupath.lib.images.servers.ImageServer) BooleanBinding(javafx.beans.binding.BooleanBinding) TextInputControl(javafx.scene.control.TextInputControl) URLDecoder(java.net.URLDecoder) UncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler) Date(java.util.Date) URISyntaxException(java.net.URISyntaxException) ObjectInputStream(java.io.ObjectInputStream) KeyCombination(javafx.scene.input.KeyCombination) DefaultImageRegionStore(qupath.lib.gui.images.stores.DefaultImageRegionStore) ByteArrayInputStream(java.io.ByteArrayInputStream) Locale(java.util.Locale) GitHubProject(qupath.lib.gui.extensions.GitHubProject) ImageIO(javax.imageio.ImageIO) RotateEvent(javafx.scene.input.RotateEvent) WindowEvent(javafx.stage.WindowEvent) PathInteractivePlugin(qupath.lib.plugins.PathInteractivePlugin) Orientation(javafx.geometry.Orientation) MenuItem(javafx.scene.control.MenuItem) Ellipse(javafx.scene.shape.Ellipse) ImageServerProvider(qupath.lib.images.servers.ImageServerProvider) Collection(java.util.Collection) Font(javafx.scene.text.Font) ServiceLoader(java.util.ServiceLoader) Collectors(java.util.stream.Collectors) BorderStroke(javafx.scene.layout.BorderStroke) PathObject(qupath.lib.objects.PathObject) Objects(java.util.Objects) ImageTypeSetting(qupath.lib.gui.prefs.PathPrefs.ImageTypeSetting) ProjectIO(qupath.lib.projects.ProjectIO) GuiTools(qupath.lib.gui.tools.GuiTools) ExecutorCompletionService(java.util.concurrent.ExecutorCompletionService) Scene(javafx.scene.Scene) ListView(javafx.scene.control.ListView) ReadOnlyObjectProperty(javafx.beans.property.ReadOnlyObjectProperty) SimpleStringProperty(javafx.beans.property.SimpleStringProperty) Action(org.controlsfx.control.action.Action) PathClassFactory(qupath.lib.objects.classes.PathClassFactory) ScriptEditor(qupath.lib.gui.scripting.ScriptEditor) TableColumn(javafx.scene.control.TableColumn) HashSet(java.util.HashSet) Insets(javafx.geometry.Insets) DetectionDisplayMode(qupath.lib.gui.viewer.OverlayOptions.DetectionDisplayMode) ExecutorService(java.util.concurrent.ExecutorService) KeyCode(javafx.scene.input.KeyCode) ActionAccelerator(qupath.lib.gui.ActionTools.ActionAccelerator) Logger(org.slf4j.Logger) Dialog(javafx.scene.control.Dialog) Label(javafx.scene.control.Label) MenuBar(javafx.scene.control.MenuBar) ActionIcon(qupath.lib.gui.ActionTools.ActionIcon) ServerBuilder(qupath.lib.images.servers.ImageServerBuilder.ServerBuilder) ScrollEvent(javafx.scene.input.ScrollEvent) Consumer(java.util.function.Consumer) SimpleBooleanProperty(javafx.beans.property.SimpleBooleanProperty) Stage(javafx.stage.Stage) ViewerPlusDisplayOptions(qupath.lib.gui.viewer.ViewerPlusDisplayOptions) Comparator(java.util.Comparator) PathTool(qupath.lib.gui.viewer.tools.PathTool) Arrays(java.util.Arrays) ServerTools(qupath.lib.images.servers.ServerTools) ActionUtils(org.controlsfx.control.action.ActionUtils) ActionDescription(qupath.lib.gui.ActionTools.ActionDescription) ReadOnlyBooleanProperty(javafx.beans.property.ReadOnlyBooleanProperty) StackPane(javafx.scene.layout.StackPane) AnnotationPane(qupath.lib.gui.panes.AnnotationPane) JFXPanel(javafx.embed.swing.JFXPanel) Category(java.util.Locale.Category) ParameterList(qupath.lib.plugins.parameters.ParameterList) TabPane(javafx.scene.control.TabPane) ScriptException(javax.script.ScriptException) CountingPanelCommand(qupath.lib.gui.commands.CountingPanelCommand) SplitPane(javafx.scene.control.SplitPane) Border(javafx.scene.layout.Border) Event(javafx.event.Event) Set(java.util.Set) KeyEvent(javafx.scene.input.KeyEvent) Screen(javafx.stage.Screen) AffineTransform(java.awt.geom.AffineTransform) QuPathViewerListener(qupath.lib.gui.viewer.QuPathViewerListener) StandardCharsets(java.nio.charset.StandardCharsets) Executors(java.util.concurrent.Executors) PathAnnotationObject(qupath.lib.objects.PathAnnotationObject) Platform(javafx.application.Platform) Region(javafx.scene.layout.Region) CommandFinderTools(qupath.lib.gui.tools.CommandFinderTools) InputDisplayCommand(qupath.lib.gui.commands.InputDisplayCommand) ImageRegionStoreFactory(qupath.lib.gui.images.stores.ImageRegionStoreFactory) ThreadTools(qupath.lib.common.ThreadTools) DefaultScriptEditor(qupath.lib.gui.scripting.DefaultScriptEditor) GitHubRepo(qupath.lib.gui.extensions.GitHubProject.GitHubRepo) BorderPane(javafx.scene.layout.BorderPane) ButtonData(javafx.scene.control.ButtonBar.ButtonData) SimpleDateFormat(java.text.SimpleDateFormat) PathPlugin(qupath.lib.plugins.PathPlugin) Projects(qupath.lib.projects.Projects) StandardCopyOption(java.nio.file.StandardCopyOption) ArrayList(java.util.ArrayList) TabClosingPolicy(javafx.scene.control.TabPane.TabClosingPolicy) QuPathViewerPlus(qupath.lib.gui.viewer.QuPathViewerPlus) ObjectOutputStream(java.io.ObjectOutputStream) LinkedHashSet(java.util.LinkedHashSet) Color(javafx.scene.paint.Color) CirclePopupMenu(jfxtras.scene.menu.CirclePopupMenu) TitledPane(javafx.scene.control.TitledPane) Files(java.nio.file.Files) ToolBar(javafx.scene.control.ToolBar) GeneralTools(qupath.lib.common.GeneralTools) Node(javafx.scene.Node) CheckBox(javafx.scene.control.CheckBox) ProjectCommands(qupath.lib.gui.commands.ProjectCommands) File(java.io.File) PathObjectTools(qupath.lib.objects.PathObjectTools) Menu(javafx.scene.control.Menu) Cursor(javafx.scene.Cursor) KeyCodeCombination(javafx.scene.input.KeyCodeCombination) Paths(java.nio.file.Paths) SimpleObjectProperty(javafx.beans.property.SimpleObjectProperty) Tab(javafx.scene.control.Tab) PathPrefs(qupath.lib.gui.prefs.PathPrefs) StringBinding(javafx.beans.binding.StringBinding) Pos(javafx.geometry.Pos) Area(java.awt.geom.Area) CheckMenuItem(javafx.scene.control.CheckMenuItem) LoggerFactory(org.slf4j.LoggerFactory) UpdateChecker(qupath.lib.gui.extensions.UpdateChecker) Parent(javafx.scene.Parent) ContextMenu(javafx.scene.control.ContextMenu) URI(java.net.URI) ImageServers(qupath.lib.images.servers.ImageServers) TableView(javafx.scene.control.TableView) ImageType(qupath.lib.images.ImageData.ImageType) Shape(java.awt.Shape) BufferedImage(java.awt.image.BufferedImage) GroovyLanguage(qupath.lib.gui.scripting.languages.GroovyLanguage) ImageServerBuilder(qupath.lib.images.servers.ImageServerBuilder) FileNotFoundException(java.io.FileNotFoundException) TreeView(javafx.scene.control.TreeView) SeparatorMenuItem(javafx.scene.control.SeparatorMenuItem) QuPathViewer(qupath.lib.gui.viewer.QuPathViewer) List(java.util.List) Duration(javafx.util.Duration) ColorToolsFX(qupath.lib.gui.tools.ColorToolsFX) Optional(java.util.Optional) LogManager(qupath.lib.gui.logging.LogManager) RadioMenuItem(javafx.scene.control.RadioMenuItem) WorkflowCommandLogView(qupath.lib.gui.panes.WorkflowCommandLogView) TextArea(javafx.scene.control.TextArea) ButtonType(javafx.scene.control.ButtonType) MouseEvent(javafx.scene.input.MouseEvent) HashMap(java.util.HashMap) BrightnessContrastCommand(qupath.lib.gui.commands.BrightnessContrastCommand) UriImageSupport(qupath.lib.images.servers.ImageServerBuilder.UriImageSupport) Dialogs(qupath.lib.gui.dialogs.Dialogs) SwingUtilities(javax.swing.SwingUtilities) HostServices(javafx.application.HostServices) ZoomEvent(javafx.scene.input.ZoomEvent) TMACommands(qupath.lib.gui.commands.TMACommands) Tooltip(javafx.scene.control.Tooltip) ImageDetailsPane(qupath.lib.gui.panes.ImageDetailsPane) ImageData(qupath.lib.images.ImageData) Desktop(java.awt.Desktop) RoiTools(qupath.lib.roi.RoiTools) ObjectProperty(javafx.beans.property.ObjectProperty) Iterator(java.util.Iterator) ProjectImageEntry(qupath.lib.projects.ProjectImageEntry) TableRow(javafx.scene.control.TableRow) PathClass(qupath.lib.objects.classes.PathClass) TMACoreObject(qupath.lib.objects.TMACoreObject) DropShadow(javafx.scene.effect.DropShadow) MenuTools(qupath.lib.gui.tools.MenuTools) BorderStrokeStyle(javafx.scene.layout.BorderStrokeStyle) ActionEvent(javafx.event.ActionEvent) ToggleGroup(javafx.scene.control.ToggleGroup) LogViewerCommand(qupath.lib.gui.commands.LogViewerCommand) SwingFXUtils(javafx.embed.swing.SwingFXUtils) Collections(java.util.Collections) InputStream(java.io.InputStream) DialogButton(qupath.lib.gui.dialogs.Dialogs.DialogButton) ImageServerBuilder(qupath.lib.images.servers.ImageServerBuilder) QuPathExtension(qupath.lib.gui.extensions.QuPathExtension) ArrayList(java.util.ArrayList) IOException(java.io.IOException) URISyntaxException(java.net.URISyntaxException) ScriptException(javax.script.ScriptException) FileNotFoundException(java.io.FileNotFoundException) Version(qupath.lib.common.Version) ReleaseVersion(qupath.lib.gui.extensions.UpdateChecker.ReleaseVersion)

Example 2 with QuPathExtension

use of qupath.lib.gui.extensions.QuPathExtension in project qupath by qupath.

the class ShowInstalledExtensionsCommand method showInstalledExtensions.

public static void showInstalledExtensions(final QuPathGUI qupath) {
    Stage dialog = new Stage();
    dialog.initOwner(qupath.getStage());
    dialog.initModality(Modality.APPLICATION_MODAL);
    dialog.setTitle("Installed extensions");
    GridPane paneExtensions = new GridPane();
    paneExtensions.setPadding(new Insets(10, 10, 10, 10));
    paneExtensions.setHgap(5);
    paneExtensions.setVgap(10);
    int row = 0;
    int inc = 1;
    for (QuPathExtension extension : qupath.getLoadedExtensions()) {
        addEntry(paneExtensions, new QuPathExtensionEntry(extension), row);
        row += inc;
    }
    GridPane paneServers = new GridPane();
    paneServers.setPadding(new Insets(10, 10, 10, 10));
    paneServers.setHgap(5);
    paneServers.setVgap(10);
    row = 0;
    for (ImageServerBuilder<?> builder : ImageServerProvider.getInstalledImageServerBuilders()) {
        addEntry(paneServers, new QuPathExtensionEntry(builder), row);
        row += inc;
    }
    TitledPane titledExtensions = new TitledPane("Extensions", paneExtensions);
    PaneTools.simplifyTitledPane(titledExtensions, false);
    TitledPane titledServers = new TitledPane("Image Servers", paneServers);
    PaneTools.simplifyTitledPane(titledServers, false);
    VBox vbox = new VBox(titledExtensions, titledServers);
    var dir = QuPathGUI.getExtensionDirectory();
    if (dir != null) {
        var btnOpen = new Button("Open extensions directory");
        btnOpen.setOnAction(e -> GuiTools.browseDirectory(dir));
        btnOpen.setMaxWidth(Double.MAX_VALUE);
        vbox.getChildren().add(btnOpen);
    // } else {
    // var label = new Label("No user directory has been set for custom user extensions.\n"
    // + "Drag an extensions jar file onto QuPath to set a user directory and install the extension.");
    // label.setTextAlignment(TextAlignment.CENTER);
    // label.setMaxWidth(Double.MAX_VALUE);
    // vbox.getChildren().add(label);
    }
    vbox.setPadding(new Insets(5));
    vbox.setMaxWidth(Double.POSITIVE_INFINITY);
    dialog.setScene(new Scene(new ScrollPane(vbox)));
    dialog.show();
}
Also used : TitledPane(javafx.scene.control.TitledPane) GridPane(javafx.scene.layout.GridPane) Insets(javafx.geometry.Insets) QuPathExtension(qupath.lib.gui.extensions.QuPathExtension) Scene(javafx.scene.Scene) Button(javafx.scene.control.Button) ScrollPane(javafx.scene.control.ScrollPane) Stage(javafx.stage.Stage) VBox(javafx.scene.layout.VBox)

Aggregations

Desktop (java.awt.Desktop)1 Shape (java.awt.Shape)1 AffineTransform (java.awt.geom.AffineTransform)1 Area (java.awt.geom.Area)1 BufferedImage (java.awt.image.BufferedImage)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 File (java.io.File)1 FileNotFoundException (java.io.FileNotFoundException)1 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 ObjectInputStream (java.io.ObjectInputStream)1 ObjectOutputStream (java.io.ObjectOutputStream)1 UncaughtExceptionHandler (java.lang.Thread.UncaughtExceptionHandler)1 URI (java.net.URI)1 URISyntaxException (java.net.URISyntaxException)1 URLDecoder (java.net.URLDecoder)1 StandardCharsets (java.nio.charset.StandardCharsets)1 Files (java.nio.file.Files)1 Path (java.nio.file.Path)1