/* * #%L * Bio-Formats Plugins for ImageJ: a collection of ImageJ plugins including the * Bio-Formats Importer, Bio-Formats Exporter, Bio-Formats Macro Extensions, * Data Browser and Stack Slicer. * %% * Copyright (C) 2006 - 2015 Open Microscopy Environment: * - Board of Regents of the University of Wisconsin-Madison * - Glencoe Software, Inc. * - University of Dundee * %% * This program 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 2 of the * License, or (at your option) any later version. * * This program 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 this program. If not, see * <http://www.gnu.org/licenses/gpl-2.0.html>. * #L% */ package loci.plugins.in; import ij.gui.GenericDialog; import java.awt.Choice; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.List; import loci.plugins.util.ImageProcessorReader; import loci.plugins.util.WindowTools; /** * Bio-Formats Importer dimension swapper dialog box. */ public class SwapDialog extends ImporterDialog implements ItemListener { // -- Fields -- private Choice zChoice, cChoice, tChoice; // -- Constructor -- /** Creates a dimension swapper dialog for the Bio-Formats Importer. */ public SwapDialog(ImportProcess process) { super(process); } // -- ImporterDialog methods -- @Override protected boolean needPrompt() { return !process.isWindowless() && options.isSwapDimensions(); } @Override protected GenericDialog constructDialog() { ImageProcessorReader reader = process.getReader(); int seriesCount = process.getSeriesCount(); GenericDialog gd = new GenericDialog("Dimension swapping options"); String[] labels = {"Z", "C", "T"}; String[] sizes = new String[] { String.valueOf(reader.getSizeZ()), String.valueOf(reader.getSizeC()), String.valueOf(reader.getSizeT()) }; for (int s=0; s<seriesCount; s++) { if (!options.isSeriesOn(s)) continue; reader.setSeries(s); gd.addMessage("Series " + (s + 1) + ":\n"); for (int i=0; i<labels.length; i++) { gd.addChoice(labels[i] + "_" + (s + 1), sizes, sizes[i]); } } List<Choice> choices = WindowTools.getChoices(gd); zChoice = choices.get(0); cChoice = choices.get(1); tChoice = choices.get(2); zChoice.addItemListener(this); cChoice.addItemListener(this); tChoice.addItemListener(this); WindowTools.addScrollBars(gd); return gd; } @Override protected boolean harvestResults(GenericDialog gd) { ImageProcessorReader reader = process.getReader(); int seriesCount = process.getSeriesCount(); for (int s=0; s<seriesCount; s++) { if (!options.isSeriesOn(s)) continue; reader.setSeries(s); int z = Integer.parseInt(gd.getNextChoice()); int c = Integer.parseInt(gd.getNextChoice()); int t = Integer.parseInt(gd.getNextChoice()); int originalZ = reader.getSizeZ(); int originalC = reader.getSizeC(); int originalT = reader.getSizeT(); String originalOrder = reader.getDimensionOrder(); StringBuffer sb = new StringBuffer(); sb.append("XY"); for (int i=2; i<originalOrder.length(); i++) { int originalValue = 0; switch (originalOrder.charAt(i)) { case 'Z': originalValue = originalZ; break; case 'C': originalValue = originalC; break; case 'T': originalValue = originalT; break; } if (originalValue == z && sb.indexOf("Z") < 0) { sb.append("Z"); } else if (originalValue == c && sb.indexOf("C") < 0) { sb.append("C"); } else if (originalValue == t && sb.indexOf("T") < 0) { sb.append("T"); } } options.setInputOrder(s, sb.toString()); } return true; } // -- ItemListener methods -- @Override public void itemStateChanged(ItemEvent e) { final Object src = e.getSource(); final int zIndex = zChoice.getSelectedIndex(); final int cIndex = cChoice.getSelectedIndex(); final int tIndex = tChoice.getSelectedIndex(); if (src == zChoice) { if (zIndex == cIndex) cChoice.select(firstAvailable(zIndex, tIndex)); else if (zIndex == tIndex) tChoice.select(firstAvailable(zIndex, cIndex)); } else if (src == cChoice) { if (cIndex == zIndex) zChoice.select(firstAvailable(cIndex, tIndex)); else if (cIndex == tIndex) tChoice.select(firstAvailable(zIndex, cIndex)); } else if (src == tChoice) { if (tIndex == zIndex) zChoice.select(firstAvailable(cIndex, tIndex)); else if (tIndex == cIndex) cChoice.select(firstAvailable(zIndex, tIndex)); } } // -- Helper methods -- private int firstAvailable(int... index) { final int minValue = 0, maxValue = 2; for (int v=minValue; v<=maxValue; v++) { boolean taken = false; for (int i : index) { if (v == i) { taken = true; break; } } if (!taken) return v; } return -1; } }