/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.core.ui.docking; import java.awt.Window; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import org.weasis.core.api.explorer.DataExplorerView; import org.weasis.core.api.gui.util.WinUtil; import org.weasis.core.ui.editor.SeriesViewer; import org.weasis.core.ui.editor.SeriesViewerFactory; import org.weasis.core.ui.editor.image.ViewerPlugin; import bibliothek.gui.dock.common.CContentArea; import bibliothek.gui.dock.common.CControl; import bibliothek.gui.dock.common.CWorkingArea; import bibliothek.gui.dock.common.event.CVetoFocusListener; import bibliothek.gui.dock.common.intern.CDockable; public class UIManager { public static final AtomicInteger dockableUIGenerator = new AtomicInteger(1); public static final List<ViewerPlugin<?>> VIEWER_PLUGINS = Collections.synchronizedList(new ArrayList<ViewerPlugin<?>>()); public static final List<DataExplorerView> EXPLORER_PLUGINS = Collections.synchronizedList(new ArrayList<DataExplorerView>()); public static final List<SeriesViewerFactory> SERIES_VIEWER_FACTORIES = Collections.synchronizedList(new ArrayList<SeriesViewerFactory>()); public static final CVetoFocusListener DOCKING_VETO_FOCUS = new CVetoFocusListener() { @Override public boolean willLoseFocus(CDockable dockable) { return false; } @Override public boolean willGainFocus(CDockable dockable) { return false; } }; public static final CControl DOCKING_CONTROL = new CControl(); public static final CContentArea BASE_AREA = DOCKING_CONTROL.getContentArea(); public static final CWorkingArea MAIN_AREA = DOCKING_CONTROL.createWorkingArea("mainArea"); //$NON-NLS-1$ // public static final CContentArea WEST_AREA = DOCKING_CONTROL.createContentArea("westArea"); private UIManager() { } public static Window getApplicationWindow() { return WinUtil.getParentWindow(UIManager.BASE_AREA); } public static DataExplorerView getExplorerplugin(String name) { if (name != null) { synchronized (EXPLORER_PLUGINS) { for (DataExplorerView view : EXPLORER_PLUGINS) { if (name.equals(view.getUIName())) { return view; } } } } return null; } public static SeriesViewerFactory getViewerFactory(SeriesViewer seriesViewer) { if (seriesViewer != null) { synchronized (UIManager.SERIES_VIEWER_FACTORIES) { List<SeriesViewerFactory> plugins = UIManager.SERIES_VIEWER_FACTORIES; for (final SeriesViewerFactory factory : plugins) { if (factory != null && factory.isViewerCreatedByThisFactory(seriesViewer)) { return factory; } } } } return null; } public static SeriesViewerFactory getViewerFactory(String mimeType) { if (mimeType != null) { synchronized (UIManager.SERIES_VIEWER_FACTORIES) { int level = Integer.MAX_VALUE; SeriesViewerFactory best = null; for (final SeriesViewerFactory f : SERIES_VIEWER_FACTORIES) { if (f != null && f.canReadMimeType(mimeType)) { if (f.getLevel() < level) { level = f.getLevel(); best = f; } } } return best; } } return null; } public static SeriesViewerFactory getViewerFactory(String[] mimeTypeList) { if (mimeTypeList != null && mimeTypeList.length > 0) { synchronized (UIManager.SERIES_VIEWER_FACTORIES) { List<SeriesViewerFactory> plugins = UIManager.SERIES_VIEWER_FACTORIES; int level = Integer.MAX_VALUE; SeriesViewerFactory best = null; for (final SeriesViewerFactory f : plugins) { if (f != null) { for (String mime : mimeTypeList) { if (f.canReadMimeType(mime) && f.getLevel() < level) { best = f; } } } } return best; } } return null; } public static List<SeriesViewerFactory> getViewerFactoryList(String[] mimeTypeList) { if (mimeTypeList != null && mimeTypeList.length > 0) { List<SeriesViewerFactory> plugins = new ArrayList<>(); synchronized (UIManager.SERIES_VIEWER_FACTORIES) { for (final SeriesViewerFactory viewerFactory : UIManager.SERIES_VIEWER_FACTORIES) { if (viewerFactory != null) { for (String mime : mimeTypeList) { if (viewerFactory.canReadMimeType(mime)) { plugins.add(viewerFactory); } } } } } Collections.sort(plugins, (s1, s2) -> (s1.getLevel() < s2.getLevel() ? -1 : (s1.getLevel() == s2.getLevel() ? 0 : 1))); return plugins; } return null; } public static void closeSeriesViewerType(Class<? extends SeriesViewer<?>> clazz) { final List<ViewerPlugin<?>> pluginsToRemove = new ArrayList<>(); synchronized (UIManager.VIEWER_PLUGINS) { for (final ViewerPlugin<?> plugin : UIManager.VIEWER_PLUGINS) { if (clazz.isInstance(plugin)) { // Do not close Series directly, it can produce deadlock. pluginsToRemove.add(plugin); } } } closeSeriesViewer(pluginsToRemove); } public static void closeSeriesViewer(final List<? extends ViewerPlugin<?>> pluginsToRemove) { if (pluginsToRemove != null) { for (final ViewerPlugin<?> viewerPlugin : pluginsToRemove) { viewerPlugin.close(); viewerPlugin.handleFocusAfterClosing(); } } } }