/* * Copyright 2010-2015 Institut Pasteur. * * This file is part of Icy. * * Icy is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Icy is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Icy. If not, see <http://www.gnu.org/licenses/>. */ package icy.gui.inspector; import icy.gui.component.ExtTabbedPanel; import icy.gui.component.ExternalizablePanel; import icy.gui.main.ActiveSequenceListener; import icy.gui.main.ActiveViewerListener; import icy.gui.system.MemoryMonitorPanel; import icy.gui.system.OutputConsolePanel; import icy.gui.system.OutputConsolePanel.OutputConsoleChangeListener; import icy.gui.viewer.Viewer; import icy.gui.viewer.ViewerEvent; import icy.main.Icy; import icy.sequence.Sequence; import icy.sequence.SequenceEvent; import icy.system.thread.ThreadUtil; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Point; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.ScrollPaneConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * This window shows all details about the current sequence. * * @author Fabrice de Chaumont & Stephane */ public class InspectorPanel extends ExternalizablePanel implements ActiveViewerListener, ActiveSequenceListener { private static final long serialVersionUID = 5538230736731006318L; /** * GUI */ final ExtTabbedPanel mainPane; final SequencePanel sequencePanel; final RoisPanel roisPanel; final LayersPanel layersPanel; final UndoManagerPanel historyPanel; final OutputConsolePanel outputConsolePanel; final ChatPanel chatPanel; /** * The width of the inner component of the inspector should not exceed 300. */ public InspectorPanel() { super("Inspector", "inspector", new Point(600, 140), new Dimension(300, 600)); // tab panel mainPane = new ExtTabbedPanel(); mainPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); // main panels sequencePanel = new SequencePanel(); // final JPanel pluginsPanel = new PluginsPanel(); roisPanel = new RoisPanel(); layersPanel = new LayersPanel(); historyPanel = new UndoManagerPanel(); outputConsolePanel = new OutputConsolePanel(); chatPanel = new ChatPanel(); // add main tab panels mainPane.addTab("Sequence", null, new JScrollPane(sequencePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER), "Sequence informations"); // mainPane.add("Active Plugin", pluginsPanel); mainPane.addTab("ROI", null, roisPanel, "Manage / edit your ROI"); mainPane.addTab("Layer", null, layersPanel, "Show all layers details"); mainPane.addTab("History", null, historyPanel, "Actions history"); mainPane.addTab("Output", null, outputConsolePanel, "Console output"); mainPane.addTab("Chat", null, chatPanel, "Chat room"); // minimum required size for sequence infos panel final Dimension minDim = new Dimension(300, 480); getFrame().setMinimumSizeInternal(minDim); getFrame().setMinimumSizeExternal(minDim); setMinimumSize(minDim); setLayout(new BorderLayout()); add(mainPane, BorderLayout.CENTER); add(new MemoryMonitorPanel(), BorderLayout.SOUTH); validate(); setVisible(true); // get default color of tab background final Color defaultBgColor = mainPane.getBackgroundAt(0); mainPane.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { final int index = getIndexOfTab(outputConsolePanel); // set back default tab color if ((index != -1) && (mainPane.getSelectedIndex() == index)) mainPane.setBackgroundAt(index, defaultBgColor); } }); outputConsolePanel.addOutputConsoleChangeListener(new OutputConsoleChangeListener() { @Override public void outputConsoleChanged(OutputConsolePanel source, boolean isError) { final int index = getIndexOfTab(outputConsolePanel); if ((index != -1) && (mainPane.getSelectedIndex() != index)) { final boolean fIsError = isError; ThreadUtil.invokeLater(new Runnable() { @Override public void run() { // change output console tab color when new data if (fIsError) mainPane.setBackgroundAt(index, Color.red); else if (!mainPane.getBackgroundAt(index).equals(Color.red)) mainPane.setBackgroundAt(index, Color.blue); } }); } } }); // add focused sequence & viewer listener Icy.getMainInterface().addActiveViewerListener(this); Icy.getMainInterface().addActiveSequenceListener(this); } /** * @return the mainPane */ public ExtTabbedPanel getMainPane() { return mainPane; } /** * @return the sequencePanel */ public SequencePanel getSequencePanel() { return sequencePanel; } /** * @return the roisPanel */ public RoisPanel getRoisPanel() { return roisPanel; } /** * @return the layersPanel */ public LayersPanel getLayersPanel() { return layersPanel; } /** * @return the historyPanel */ public UndoManagerPanel getHistoryPanel() { return historyPanel; } /** * @return the outputConsolePanel */ public OutputConsolePanel getOutputConsolePanel() { return outputConsolePanel; } /** * @return the chatPanel */ public ChatPanel getChatPanel() { return chatPanel; } /** * Return the index of specified tab component */ protected int getIndexOfTab(Component component) { return mainPane.indexOfComponent(component); } @Override public void viewerActivated(Viewer viewer) { sequencePanel.viewerActivated(viewer); layersPanel.viewerActivated(viewer); } @Override public void viewerDeactivated(Viewer viewer) { // nothing to do here } /** * Called when focused viewer has changed */ @Override public void activeViewerChanged(ViewerEvent event) { sequencePanel.activeViewerChanged(event); layersPanel.activeViewerChanged(event); } @Override public void sequenceActivated(Sequence sequence) { sequencePanel.sequenceActivated(sequence); roisPanel.sequenceActivated(sequence); historyPanel.sequenceActivated(sequence); } @Override public void sequenceDeactivated(Sequence sequence) { // nothing to do here } /** * Called by mainInterface when focused sequence has changed */ @Override public void activeSequenceChanged(SequenceEvent event) { sequencePanel.activeSequenceChanged(event); roisPanel.activeSequenceChanged(event); } }