/* * 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.viewer; import icy.canvas.IcyCanvas; import icy.gui.component.ColorComponent; import icy.gui.util.ComponentUtil; import icy.gui.util.GuiUtil; import icy.image.IcyBufferedImage; import icy.math.MathUtil; import icy.sequence.Sequence; import icy.type.collection.array.ArrayUtil; import icy.util.StringUtil; import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JLabel; import javax.swing.JPanel; public class MouseImageInfosPanel extends JPanel { /** * */ private static final long serialVersionUID = -5994107451349072824L; private static final int SIGNIFICANT_DIGIT = 5; private final JLabel xLabel; private final JLabel yLabel; private final JLabel zLabel; private final JLabel tLabel; private final JLabel cLabel; private final JLabel dataLabel; private final JLabel xValue; private final JLabel yValue; private final JLabel zValue; private final JLabel tValue; private final JLabel cValue; private final JLabel dataValue; private final ColorComponent colorComp; private boolean infoXVisible; private boolean infoYVisible; private boolean infoZVisible; private boolean infoTVisible; private boolean infoCVisible; private boolean infoDataVisible; private boolean infoColorVisible; public MouseImageInfosPanel() { super(true); infoXVisible = true; infoYVisible = true; infoTVisible = true; infoZVisible = true; infoCVisible = true; infoDataVisible = true; infoColorVisible = true; colorComp = new ColorComponent(); ComponentUtil.setFixedSize(colorComp, new Dimension(30, 14)); xValue = new JLabel(); ComponentUtil.setFixedWidth(xValue, 58); yValue = new JLabel(); ComponentUtil.setFixedWidth(yValue, 58); zValue = new JLabel(); ComponentUtil.setFixedWidth(zValue, 40); tValue = new JLabel(); ComponentUtil.setFixedWidth(tValue, 40); cValue = new JLabel(); ComponentUtil.setFixedWidth(cValue, 40); dataValue = new JLabel(); ComponentUtil.setFixedWidth(dataValue, 200); xLabel = GuiUtil.createBoldLabel(" X "); yLabel = GuiUtil.createBoldLabel(" Y "); zLabel = GuiUtil.createBoldLabel(" Z "); tLabel = GuiUtil.createBoldLabel(" T "); cLabel = GuiUtil.createBoldLabel(" C "); dataLabel = GuiUtil.createBoldLabel(" Value "); final JPanel infosPanel = new JPanel(); infosPanel.setLayout(new BoxLayout(infosPanel, BoxLayout.LINE_AXIS)); infosPanel.add(colorComp); infosPanel.add(Box.createHorizontalStrut(10)); infosPanel.add(xLabel); infosPanel.add(xValue); infosPanel.add(yLabel); infosPanel.add(yValue); infosPanel.add(zLabel); infosPanel.add(zValue); infosPanel.add(tLabel); infosPanel.add(tValue); infosPanel.add(cLabel); infosPanel.add(cValue); infosPanel.add(dataLabel); infosPanel.add(dataValue); setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); setLayout(new BorderLayout()); add(infosPanel, BorderLayout.WEST); add(new JPanel(), BorderLayout.CENTER); validate(); updateInfos(null); } /** * @return the xInfoVisible */ public boolean isInfoXVisible() { return infoXVisible; } /** * @param value * the xInfoVisible to set */ public void setInfoXVisible(boolean value) { if (infoXVisible != value) { infoXVisible = value; xLabel.setVisible(value); xValue.setVisible(value); } } /** * @return the yInfoVisible */ public boolean isInfoYVisible() { return infoYVisible; } /** * @param value * the yInfoVisible to set */ public void setInfoYVisible(boolean value) { if (infoYVisible != value) { infoYVisible = value; yLabel.setVisible(value); yValue.setVisible(value); } } /** * @return the zInfoVisible */ public boolean isInfoZVisible() { return infoZVisible; } /** * @param value * the zInfoVisible to set */ public void setInfoZVisible(boolean value) { if (infoZVisible != value) { infoZVisible = value; zLabel.setVisible(value); zValue.setVisible(value); } } /** * @return the tInfoVisible */ public boolean isInfoTVisible() { return infoTVisible; } /** * @param value * the tInfoVisible to set */ public void setInfoTVisible(boolean value) { if (infoTVisible != value) { infoTVisible = value; tLabel.setVisible(value); tValue.setVisible(value); } } /** * @return the cInfoVisible */ public boolean isInfoCVisible() { return infoCVisible; } /** * @param value * the cInfoVisible to set */ public void setInfoCVisible(boolean value) { if (infoCVisible != value) { infoCVisible = value; cLabel.setVisible(value); cValue.setVisible(value); } } /** * @return the dataInfoVisible */ public boolean isInfoDataVisible() { return infoDataVisible; } /** * @param value * the dataInfoVisible to set */ public void setInfoDataVisible(boolean value) { if (infoDataVisible != value) { infoDataVisible = value; dataLabel.setVisible(value); dataValue.setVisible(value); } } /** * @return the colorInfoVisible */ public boolean isInfoColorVisible() { return infoColorVisible; } /** * @param value * the colorInfoVisible to set */ public void setInfoColorVisible(boolean value) { if (infoColorVisible != value) { infoColorVisible = value; colorComp.setVisible(value); } } public void updateInfos(IcyCanvas canvas) { final Sequence seq; if (canvas != null) seq = canvas.getSequence(); else seq = null; if (seq != null) { final double x = canvas.getMouseImagePosX(); final double y = canvas.getMouseImagePosY(); final double z = canvas.getMouseImagePosZ(); final double t = canvas.getMouseImagePosT(); final double c = canvas.getMouseImagePosC(); final int xi = (int) x; final int yi = (int) y; final int zi = (int) z; final int ti = (int) t; final int ci = (int) c; final String xs; final String ys; final String zs; final String ts; final String cs; if (x == xi) xs = StringUtil.toString(xi); else xs = StringUtil.toStringEx(x, SIGNIFICANT_DIGIT); if (y == yi) ys = StringUtil.toString(yi); else ys = StringUtil.toStringEx(y, SIGNIFICANT_DIGIT); if (z == zi) zs = StringUtil.toString(zi); else zs = StringUtil.toStringEx(z, SIGNIFICANT_DIGIT); if (t == ti) ts = StringUtil.toString(ti); else ts = StringUtil.toStringEx(t, SIGNIFICANT_DIGIT); if (c == ci) cs = StringUtil.toString(ci); else cs = StringUtil.toStringEx(c, SIGNIFICANT_DIGIT); xValue.setText(xs); yValue.setText(ys); zValue.setText(zs); tValue.setText(ts); cValue.setText(cs); xValue.setToolTipText(xValue.getText()); yValue.setToolTipText(yValue.getText()); zValue.setToolTipText(zValue.getText()); tValue.setToolTipText(tValue.getText()); cValue.setToolTipText(cValue.getText()); final IcyBufferedImage image = seq.getImage(ti, zi); if ((image != null) && (image.isInside(xi, yi))) { try { // FIXME : should take C value in account to retrieve single component color colorComp.setColor(image.getRGB(xi, yi, canvas.getLut())); if (ci == -1) { // all components values dataValue.setText(ArrayUtil.array1DToString(image.getDataCopyC(xi, yi), image.getDataType_() .isSigned(), false, " : ", 5)); } else { // single component value final double v = image.getData(xi, yi, ci); final int vi = (int) v; final String vs; if (v == vi) vs = Integer.toString(vi); else vs = Double.toString(MathUtil.roundSignificant(v, SIGNIFICANT_DIGIT, true)); dataValue.setText(vs); } } catch (Exception e) { // ignore exception as we can have unsync update } dataValue.setToolTipText(dataValue.getText()); } else { dataValue.setText("-"); colorComp.setColor(null); dataValue.setToolTipText(null); } } else { xValue.setText("-"); yValue.setText("-"); zValue.setText("-"); tValue.setText("-"); cValue.setText("-"); dataValue.setText("-"); colorComp.setColor(null); xValue.setToolTipText(null); yValue.setToolTipText(null); zValue.setToolTipText(null); tValue.setToolTipText(null); cValue.setToolTipText(null); dataValue.setToolTipText(null); } } }