Changeset 1798


Ignore:
Timestamp:
11/15/06 16:37:24 (13 years ago)
Author:
curtis
Message:

Revamped Bio-Formats Importer plugin to properly record parameters with
macro recorder, and to properly execute when run as part of a macro.

Still need to finish scroll bar logic to work with GenericDialogs.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/plugins/Importer.java

    r1776 r1798  
    3232import ij.measure.Calibration; 
    3333import ij.process.*; 
    34 import java.awt.Dimension; 
    35 import java.awt.event.*; 
     34import java.awt.*; 
    3635import java.awt.image.*; 
    3736import java.io.File; 
     
    4746 * @author Melissa Linkert linkert at cs.wisc.edu 
    4847 */ 
    49 public class Importer implements ActionListener, ItemListener { 
     48public class Importer { 
    5049 
    5150  // -- Fields -- 
    52  
    53   private JCheckBox merge = null; 
    54   private JCheckBox ignore = null; 
    55   private JCheckBox colorizeChannels = null; 
    56   private JCheckBox newWindows = null; 
    57   private JCheckBox showMeta = null; 
    58   private JCheckBox stitching = null; 
    59   private JCheckBox ranges = null; 
    60   private JCheckBox[] boxes = null; 
    61   private JButton okButton = null; 
    62   private JFrame seriesFrame = null; 
    63   private boolean mergeChannels; 
    64   private boolean ignoreTables; 
    65   private boolean colorize; 
    66   private boolean splitWindows; 
    67   private boolean showMetadata; 
    68   private boolean stitchFiles; 
    69   private boolean specifyRanges; 
    70   private boolean[] series = null; 
    7151 
    7252  private LociImporter plugin; 
     
    8060  /** Executes the plugin. */ 
    8161  public void run(String arg) { 
    82     // load preferences from IJ_Prefs.txt 
    83     mergeChannels = Prefs.get("bioformats.mergeChannels", false); 
    84     ignoreTables = Prefs.get("bioformats.ignoreTable", false); 
    85     colorize = Prefs.get("bioformats.colorize", false); 
    86     splitWindows = Prefs.get("bioformats.splitWindows", true); 
    87     showMetadata = Prefs.get("bioformats.showMetadata", false); 
    88     stitchFiles = Prefs.get("bioformats.stitchFiles", false); 
    89     specifyRanges = Prefs.get("bioformats.specifyRanges", false); 
    90  
    91     boolean quiet = !"".equals(arg); 
     62    boolean quiet = arg != null && !arg.equals(""); 
     63    String options = Macro.getOptions(); 
     64 
     65    // -- Step 1: get filename to open -- 
    9266 
    9367    String id = null; 
     68 
     69    // try to get filename from argument 
     70    if (quiet) id = arg; 
     71 
     72    if (id == null) { 
     73      // try to get filename from macro options 
     74      if (options != null) { 
     75        String open = Macro.getValue(options, "open", null); 
     76        if (open != null) id = open; 
     77      } 
     78    } 
     79 
     80    // if necessary, prompt the user for the filename 
     81    OpenDialog od = new OpenDialog("Open", id); 
     82    String directory = od.getDirectory(); 
     83    String fileName = od.getFileName(); 
     84    if (fileName == null) { 
     85      plugin.canceled = true; 
     86      return; 
     87    } 
     88    id = directory + fileName; 
     89 
     90    // if no valid filename, give up 
     91    if (id == null || !new File(id).exists()) { 
     92      if (!quiet) { 
     93        IJ.error("LOCI Bio-Formats", "The specified file " + 
     94          (id == null ? "" : ("(" + id + ") ")) + "does not exist."); 
     95      } 
     96      return; 
     97    } 
     98 
     99    // -- Step 2: identify file -- 
     100 
     101    IJ.showStatus("Identifying " + fileName); 
     102 
     103    // determine whether we can handle this file 
    94104    ImageReader reader = new ImageReader(); 
    95105    IFormatReader r = null; 
    96  
    97     String mergeString = "Merge channels to RGB"; 
    98     String ignoreString = "Ignore color lookup table"; 
    99     String colorizeString = "Colorize channels"; 
    100     String splitString = "Open each channel in its own window"; 
    101     String metadataString = "Display associated metadata"; 
    102     String stitchString = "Stitch files with similar names"; 
    103     String rangeString = "Specify range for each series"; 
    104     if (quiet && new File(arg).exists()) { // try to open the given file 
    105       id = arg; 
    106  
    107       // first determine whether we can handle this file 
    108       try { r = reader.getReader(id); } 
    109       catch (Exception exc) { return; } 
    110  
    111       // we still want to prompt for channel merge/split 
    112       GenericDialog gd = new GenericDialog("LOCI Bio-Formats Import Options"); 
    113       gd.addCheckbox(mergeString, mergeChannels); 
    114       gd.addCheckbox(ignoreString, ignoreTables); 
    115       gd.addCheckbox(colorizeString, colorize); 
    116       gd.addCheckbox(splitString, splitWindows); 
    117       gd.addCheckbox(metadataString, showMetadata); 
    118       gd.addCheckbox(stitchString, stitchFiles); 
    119       gd.addCheckbox(rangeString, specifyRanges); 
    120       gd.showDialog(); 
    121       if (gd.wasCanceled()) { 
    122         plugin.canceled = true; 
    123         return; 
    124       } 
    125       mergeChannels = gd.getNextBoolean(); 
    126       ignoreTables = gd.getNextBoolean(); 
    127       colorize = gd.getNextBoolean(); 
    128       splitWindows = gd.getNextBoolean(); 
    129       showMetadata = gd.getNextBoolean(); 
    130       stitchFiles = gd.getNextBoolean(); 
    131       specifyRanges = gd.getNextBoolean(); 
    132     } 
    133     else { // prompt the user for a file using a file chooser 
    134       // use system L&F, to match ImageJ's appearance to the extent possible 
    135       LookAndFeel laf = null; 
    136       try { 
    137         laf = UIManager.getLookAndFeel(); 
    138         String sys = UIManager.getSystemLookAndFeelClassName(); 
    139         UIManager.setLookAndFeel(sys); 
    140       } 
    141       catch (Exception exc) { exc.printStackTrace(); } 
    142  
    143       JFileChooser chooser = reader.getFileChooser(); 
    144       String dir = OpenDialog.getDefaultDirectory(); 
    145       if (dir != null) chooser.setCurrentDirectory(new File(dir)); 
    146  
    147       // add some additional options to the file chooser 
    148       JPanel panel = new JPanel(); 
    149       panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
    150       merge = new JCheckBox(mergeString, mergeChannels); 
    151       ignore = new JCheckBox(ignoreString, ignoreTables); 
    152       colorizeChannels = new JCheckBox(colorizeString, colorize); 
    153       newWindows = new JCheckBox(splitString, splitWindows); 
    154       showMeta = new JCheckBox(metadataString, showMetadata); 
    155       stitching = new JCheckBox(stitchString, stitchFiles); 
    156       ranges = new JCheckBox(rangeString, specifyRanges); 
    157       merge.addItemListener(this); 
    158       ignore.addItemListener(this); 
    159       colorizeChannels.addItemListener(this); 
    160       newWindows.addItemListener(this); 
    161       showMeta.addItemListener(this); 
    162       stitching.addItemListener(this); 
    163       ranges.addItemListener(this); 
    164       panel.add(merge); 
    165       panel.add(ignore); 
    166       panel.add(colorizeChannels); 
    167       panel.add(newWindows); 
    168       panel.add(showMeta); 
    169       panel.add(stitching); 
    170       panel.add(ranges); 
    171       chooser.setAccessory(panel); 
    172  
    173       int rval = chooser.showOpenDialog(null); 
    174  
    175       // restore original L&F 
    176       if (laf != null) { 
    177         try { UIManager.setLookAndFeel(laf); } 
    178         catch (UnsupportedLookAndFeelException exc) { exc.printStackTrace(); } 
    179       } 
    180  
    181       if (rval == JFileChooser.APPROVE_OPTION) { 
    182         final File file = chooser.getSelectedFile(); 
    183         if (file != null) { 
    184           id = file.getAbsolutePath(); 
    185           OpenDialog.setDefaultDirectory( 
    186             chooser.getCurrentDirectory().getPath()); 
    187         } 
    188       } 
    189       else { 
    190         plugin.canceled = true; 
    191         return; 
    192       } 
    193     } 
    194  
    195     if (id == null) return; 
    196     String fileName = id.substring(id.lastIndexOf(File.separator) + 1); 
    197  
    198     IJ.showStatus("Opening " + fileName); 
    199  
    200     boolean doRGBMerge = false; 
     106    try { r = reader.getReader(id); } 
     107    catch (Exception exc) { 
     108      exc.printStackTrace(); 
     109      IJ.showStatus(""); 
     110      if (!quiet) { 
     111        String msg = exc.getMessage(); 
     112        IJ.error("LOCI Bio-Formats", "Sorry, there was a problem " + 
     113          "reading the file" + (msg == null ? "." : (":\n" + msg))); 
     114      } 
     115      return; 
     116    } 
     117 
     118    // -- Step 3: get parameter values -- 
     119 
     120    IJ.showStatus(""); 
     121 
     122    final String mergeString = "Merge channels to RGB"; 
     123    final String ignoreString = "Ignore color lookup table"; 
     124    final String colorizeString = "Colorize channels"; 
     125    final String splitString = "Open each channel in its own window"; 
     126    final String metadataString = "Display associated metadata"; 
     127    final String stitchString = "Stitch files with similar names"; 
     128    final String rangeString = "Specify range for each series"; 
     129 
     130    // load preferences from IJ_Prefs.txt 
     131    boolean mergeChannels = Prefs.get("bioformats.mergeChannels", false); 
     132    boolean ignoreTables = Prefs.get("bioformats.ignoreTable", false); 
     133    boolean colorize = Prefs.get("bioformats.colorize", false); 
     134    boolean splitWindows = Prefs.get("bioformats.splitWindows", true); 
     135    boolean showMetadata = Prefs.get("bioformats.showMetadata", false); 
     136    boolean stitchFiles = Prefs.get("bioformats.stitchFiles", false); 
     137    boolean specifyRanges = Prefs.get("bioformats.specifyRanges", false); 
     138 
     139    // prompt for parameters, if necessary 
     140    GenericDialog pd = new GenericDialog("LOCI Bio-Formats Import Options"); 
     141    pd.addCheckbox(mergeString, mergeChannels); 
     142    pd.addCheckbox(ignoreString, ignoreTables); 
     143    pd.addCheckbox(colorizeString, colorize); 
     144    pd.addCheckbox(splitString, splitWindows); 
     145    pd.addCheckbox(metadataString, showMetadata); 
     146    pd.addCheckbox(stitchString, stitchFiles); 
     147    pd.addCheckbox(rangeString, specifyRanges); 
     148    pd.showDialog(); 
     149    if (pd.wasCanceled()) { 
     150      plugin.canceled = true; 
     151      return; 
     152    } 
     153    mergeChannels = pd.getNextBoolean(); 
     154    ignoreTables = pd.getNextBoolean(); 
     155    colorize = pd.getNextBoolean(); 
     156    splitWindows = pd.getNextBoolean(); 
     157    showMetadata = pd.getNextBoolean(); 
     158    stitchFiles = pd.getNextBoolean(); 
     159    specifyRanges = pd.getNextBoolean(); 
     160 
     161    // -- Step 4: open file -- 
     162 
     163    IJ.showStatus("Analyzing " + fileName); 
    201164 
    202165    try { 
    203       if (r == null) r = reader.getReader(id); 
    204       if (stitchFiles) r = new FileStitcher(r); 
     166      boolean doRGBMerge = false; 
     167 
     168      // -- Step 4a: do some preparatory work -- 
     169 
    205170      if (mergeChannels) r = new ChannelMerger(r); 
    206171      else r = new ChannelSeparator(r); 
     172      if (stitchFiles) r = new FileStitcher(r); 
    207173 
    208174      if (!ignoreTables) { 
     
    217183        } 
    218184      } 
    219  
    220185      r.setIgnoreColorTable(ignoreTables); 
    221186 
     
    225190      r.setMetadataStore(store); 
    226191 
    227       // if necessary, prompt for the series to open 
    228  
    229192      int seriesCount = r.getSeriesCount(id); 
    230       series = new boolean[seriesCount]; 
     193      boolean[] series = new boolean[seriesCount]; 
    231194      series[0] = true; 
    232       store = (OMEXMLMetadataStore) r.getMetadataStore(id); 
    233  
    234       JPanel pane = new JPanel(); 
    235       pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS)); 
    236       pane.setMaximumSize(new Dimension(350, 350)); 
    237       boxes = new JCheckBox[seriesCount]; 
    238  
     195//      store = (OMEXMLMetadataStore) r.getMetadataStore(id); 
     196 
     197      // build descriptive string and range for each series 
     198      String[] seriesStrings = new String[seriesCount]; 
     199      int[] num = new int[seriesCount]; 
     200      int[] begin = new int[seriesCount]; 
     201      int[] end = new int[seriesCount]; 
     202      int[] step = new int[seriesCount]; 
    239203      for (int i=0; i<seriesCount; i++) { 
    240204        r.setSeries(id, i); 
    241         int sizeX = r.getSizeX(id); 
    242         int sizeY = r.getSizeY(id); 
    243         int imageCount = r.getImageCount(id); 
     205        num[i] = r.getImageCount(id); 
     206        StringBuffer sb = new StringBuffer(); 
     207        sb.append("Series_"); 
     208        sb.append(i + 1); 
     209        sb.append(" - "); 
    244210        String name = store.getImageName(new Integer(i)); 
    245         if (name == null || name.length() == 0) { 
    246           name = "Series " + (i + 1); 
    247         } 
    248         boxes[i] = new JCheckBox(name + " : " + sizeX + " x " + sizeY + 
    249           " x " + imageCount, i == 0); 
    250         boxes[i].addItemListener(this); 
    251         pane.add(boxes[i]); 
    252       } 
     211        if (name != null && name.length() > 0) { 
     212          sb.append(name); 
     213          sb.append(": "); 
     214        } 
     215        sb.append(r.getSizeX(id)); 
     216        sb.append(" x "); 
     217        sb.append(r.getSizeY(id)); 
     218        sb.append("; "); 
     219        sb.append(num[i]); 
     220        sb.append(" planes"); 
     221        if (r.isOrderCertain(id)) { 
     222          sb.append(" ("); 
     223          boolean first = true; 
     224          int sizeC = r.getSizeC(id); 
     225          int sizeZ = r.getSizeZ(id); 
     226          int sizeT = r.getSizeT(id); 
     227          if (sizeC > 1) { 
     228            sb.append(sizeC); 
     229            sb.append("C"); 
     230            first = false; 
     231          } 
     232          if (sizeZ > 1) { 
     233            if (!first) sb.append(" x "); 
     234            sb.append(sizeZ); 
     235            sb.append("Z"); 
     236            first = false; 
     237          } 
     238          if (sizeT > 1) { 
     239            if (!first) sb.append(" x "); 
     240            sb.append(sizeT); 
     241            sb.append("T"); 
     242            first = false; 
     243          } 
     244          sb.append(")"); 
     245        } 
     246        seriesStrings[i] = sb.toString(); 
     247        begin[i] = 0; 
     248        end[i] = num[i] - 1; 
     249        step[i] = 1; 
     250      } 
     251 
     252      // -- Step 4a: prompt for the series to open, if necessary -- 
    253253 
    254254      if (seriesCount > 1) { 
    255         okButton = new JButton("OK"); 
    256         okButton.addActionListener(this); 
    257         pane.add(okButton); 
    258  
    259         JScrollPane scroller = new JScrollPane(pane); 
    260  
    261         seriesFrame = new JFrame("LOCI Bio-Formats Series Chooser"); 
    262         scroller.setMaximumSize(new Dimension(350, 350)); 
    263         seriesFrame.setContentPane(scroller); 
    264         seriesFrame.pack(); 
    265         seriesFrame.setSize(350, 350); 
    266         seriesFrame.setVisible(true); 
    267         seriesFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    268         seriesFrame.setVisible(true); 
    269         while (seriesFrame.isShowing()); 
    270       } 
     255        IJ.showStatus(""); 
     256 
     257        GenericDialog sd = new GenericDialog("LOCI Bio-Formats Series Options"); 
     258        for (int i=0; i<seriesCount; i++) { 
     259          sd.addCheckbox(seriesStrings[i], series[i]); 
     260        } 
     261//        addScrollBars(sd); 
     262        sd.showDialog(); 
     263        if (sd.wasCanceled()) { 
     264          plugin.canceled = true; 
     265          return; 
     266        } 
     267        for (int i=0; i<seriesCount; i++) series[i] = sd.getNextBoolean(); 
     268      } 
     269 
     270      // -- Step 4b: prompt for the range of planes to import, if necessary -- 
     271 
     272      if (specifyRanges) { 
     273        boolean needRange = false; 
     274        for (int i=0; i<seriesCount; i++) { 
     275          if (series[i] && num[i] > 1) needRange = true; 
     276        } 
     277        if (needRange) { 
     278          IJ.showStatus(""); 
     279          GenericDialog rd = 
     280            new GenericDialog("LOCI Bio-Formats Range Options"); 
     281          for (int i=0; i<seriesCount; i++) { 
     282            if (!series[i]) continue; 
     283            rd.addMessage(seriesStrings[i].replaceAll("_", " ")); 
     284            String s = "_" + (i + 1); 
     285            rd.addNumericField("Begin" + s, begin[i] + 1, 0); 
     286            rd.addNumericField("End" + s, end[i] + 1, 0); 
     287            rd.addNumericField("Step" + s, step[i], 0); 
     288          } 
     289//          addScrollBars(rd); 
     290          rd.showDialog(); 
     291          if (rd.wasCanceled()) { 
     292            plugin.canceled = true; 
     293            return; 
     294          } 
     295          for (int i=0; i<seriesCount; i++) { 
     296            if (!series[i]) continue; 
     297            begin[i] = (int) rd.getNextNumber() - 1; 
     298            end[i] = (int) rd.getNextNumber() - 1; 
     299            step[i] = (int) rd.getNextNumber(); 
     300            if (begin[i] < 0) begin[i] = 0; 
     301            if (begin[i] >= num[i]) begin[i] = num[i] - 1; 
     302            if (end[i] < begin[i]) end[i] = begin[i]; 
     303            if (end[i] >= num[i]) end[i] = num[i] - 1; 
     304            if (step[i] < 1) step[i] = 1; 
     305          } 
     306        } 
     307      } 
     308 
     309      // -- Step 4c: display metadata, when appropriate -- 
    271310 
    272311      if (showMetadata) { 
     312        IJ.showStatus("Populating metadata"); 
     313 
    273314        // display standard metadata in a table in its own window 
    274315        Hashtable meta = r.getMetadata(id); 
     
    290331        frame.setVisible(true); 
    291332        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    292       } 
    293  
    294       for (int i=0; i<series.length; i++) { 
     333        WindowManager.addWindow(frame); 
     334      } 
     335 
     336      // -- Step 4d: read pixel data -- 
     337 
     338      IJ.showStatus("Reading " + fileName); 
     339 
     340      for (int i=0; i<seriesCount; i++) { 
    295341        if (!series[i]) continue; 
    296342        r.setSeries(id, i); 
    297343 
    298         String name = id + " - " + store.getImageName(new Integer(i)); 
    299  
    300         int num = r.getImageCount(id); 
    301         int begin = 0, end = num - 1, step = 1; 
    302         if (specifyRanges && num > 1) { 
    303           // prompt for range of image planes to import 
    304           GenericDialog range = 
    305             new GenericDialog("LOCI Bio-Formats Range Chooser"); 
    306           range.addMessage("Series " + (i + 1) + ": " + num + " planes"); 
    307           range.addNumericField("Series_" + (i + 1) + "_Begin: ", 1, 0); 
    308           range.addNumericField("Series_" + (i + 1) + "_End: ", num, 0); 
    309           range.addNumericField("Series_" + (i + 1) + "_Step: ", 1, 0); 
    310           range.showDialog(); 
    311           if (range.wasCanceled()) continue; 
    312           begin = (int) range.getNextNumber() - 1; 
    313           end = (int) range.getNextNumber() - 1; 
    314           step = (int) range.getNextNumber(); 
    315         } 
    316         if (begin < 0) begin = 0; 
    317         if (begin >= num) begin = num - 1; 
    318         if (end < begin) end = begin; 
    319         if (end >= num) end = num - 1; 
    320         if (step < 1) step = 1; 
    321         int total = (end - begin) / step + 1; 
     344        String name = store.getImageName(new Integer(i)); 
     345        String imageName = fileName; 
     346        if (name != null && name.length() > 0) imageName += " - " + name; 
     347 
     348        int total = (end[i] - begin[i]) / step[i] + 1; 
    322349 
    323350        // dump OME-XML to ImageJ's description field, if available 
     
    332359        int sizeT = r.getSizeT(id); 
    333360 
    334         if (specifyRanges && num > 1) { 
     361        if (specifyRanges && num[i] > 1) { 
    335362          // reset sizeZ and sizeT if we aren't opening the entire series 
    336           sizeZ = begin; 
    337           sizeT = end; 
     363          sizeZ = begin[i]; 
     364          sizeT = end[i]; 
     365          // CTR: huh? this makes no sense 
    338366          if (channels > 1) { 
    339367            channels = r.getIndex(id, 0, 1, 0) - r.getIndex(id, 0, 0, 0); 
     
    342370 
    343371        int q = 0; 
    344         for (int j=begin; j<=end; j+=step) { 
     372        for (int j=begin[i]; j<=end[i]; j+=step[i]) { 
    345373          // limit message update rate 
    346374          long clock = System.currentTimeMillis(); 
    347           if (clock - time >= 50) { 
    348             IJ.showStatus("Reading plane " + (j + 1) + "/" + (end + 1)); 
     375          if (clock - time >= 100) { 
     376            IJ.showStatus("Reading " + (seriesCount > 1 ? "series " + 
     377              (i + 1) + ", " : "") + "plane " + (j + 1) + "/" + (end[i] + 1)); 
    349378            time = clock; 
    350379          } 
     
    352381          BufferedImage img = r.openImage(id, j); 
    353382 
    354           if (img.getWidth() < r.getSizeX(id) || 
    355             img.getHeight() < r.getSizeY(id)) 
    356           { 
    357             img = ImageTools.padImage(img, r.getSizeX(id), r.getSizeY(id)); 
    358           } 
    359  
    360           int cCoord = r.getZCTCoords(id, j)[1]; 
    361  
     383          int sizeX = r.getSizeX(id), sizeY = r.getSizeY(id); 
     384          if (img.getWidth() < sizeX || img.getHeight() < sizeY) { 
     385            img = ImageTools.padImage(img, sizeX, sizeY); 
     386          } 
     387 
     388          // autoscale >8-bit data to that RGB merge looks reasonable 
     389//          int cCoord = r.getZCTCoords(id, j)[1]; 
    362390//          Double min = r.getChannelGlobalMinimum(id, cCoord); 
    363391//          Double max = r.getChannelGlobalMaximum(id, cCoord); 
    364392          Double min = null, max = null; 
    365  
    366           if (r.isRGB(id) && r.getPixelType(id) >= FormatReader.INT16) { 
    367  
     393          if (!doRGBMerge && r.isRGB(id) && 
     394            r.getPixelType(id) >= FormatReader.INT16) 
     395          { 
    368396            if (min == null || max == null) { 
    369397              // call ImageJ's RGB merge utility after we display 
     
    376404          } 
    377405 
     406          // extract bytes from buffered image 
    378407          ImageProcessor ip = null; 
    379408          WritableRaster raster = img.getRaster(); 
     
    392421              ip = new ByteProcessor(w, h, b, null); 
    393422              if (stackB == null) stackB = new ImageStack(w, h); 
    394               stackB.addSlice(name + ":" + (j + 1), ip); 
     423              stackB.addSlice(imageName + ":" + (j + 1), ip); 
    395424            } 
    396425            else if (tt == DataBuffer.TYPE_USHORT) { 
     
    403432              ip = new ShortProcessor(w, h, s, null); 
    404433              if (stackS == null) stackS = new ImageStack(w, h); 
    405               stackS.addSlice(name + ":" + (j + 1), ip); 
     434              stackS.addSlice(imageName + ":" + (j + 1), ip); 
    406435            } 
    407436            else if (tt == DataBuffer.TYPE_FLOAT) { 
     
    417446              if (stackB != null) { 
    418447                ip = ip.convertToByte(true); 
    419                 stackB.addSlice(name + ":" + (j + 1), ip); 
     448                stackB.addSlice(imageName + ":" + (j + 1), ip); 
    420449                stackF = null; 
    421450              } 
    422451              else if (stackS != null) { 
    423452                ip = ip.convertToShort(true); 
    424                 stackS.addSlice(name + ":" + (j + 1), ip); 
     453                stackS.addSlice(imageName + ":" + (j + 1), ip); 
    425454                stackF = null; 
    426455              } 
    427               else stackF.addSlice(name + ":" + (j + 1), ip); 
     456              else stackF.addSlice(imageName + ":" + (j + 1), ip); 
    428457            } 
    429458          } 
     
    431460            ip = new ImagePlus(null, img).getProcessor(); // slow 
    432461            if (stackO == null) stackO = new ImageStack(w, h); 
    433             stackO.addSlice(name + ":" + (j + 1), ip); 
    434           } 
    435         } 
     462            stackO.addSlice(imageName + ":" + (j + 1), ip); 
     463          } 
     464        } 
     465 
    436466        IJ.showStatus("Creating image"); 
    437467        IJ.showProgress(1); 
     
    439469        if (stackB != null) { 
    440470          if (!mergeChannels && splitWindows) { 
    441             slice(stackB, id, sizeZ, channels, sizeT, fi, r, specifyRanges); 
    442           } 
    443           else imp = new ImagePlus(name, stackB); 
     471            slice(stackB, id, sizeZ, channels, sizeT, 
     472              fi, r, specifyRanges, colorize); 
     473          } 
     474          else imp = new ImagePlus(imageName, stackB); 
    444475        } 
    445476        if (stackS != null) { 
    446477          if (!mergeChannels && splitWindows) { 
    447             slice(stackS, id, sizeZ, channels, sizeT, fi, r, specifyRanges); 
    448           } 
    449           else imp = new ImagePlus(name, stackS); 
     478            slice(stackS, id, sizeZ, channels, sizeT, 
     479              fi, r, specifyRanges, colorize); 
     480          } 
     481          else imp = new ImagePlus(imageName, stackS); 
    450482        } 
    451483        if (stackF != null) { 
    452484          if (!mergeChannels && splitWindows) { 
    453             slice(stackF, id, sizeZ, channels, sizeT, fi, r, specifyRanges); 
    454           } 
    455           else imp = new ImagePlus(name, stackF); 
     485            slice(stackF, id, sizeZ, channels, sizeT, 
     486              fi, r, specifyRanges, colorize); 
     487          } 
     488          else imp = new ImagePlus(imageName, stackF); 
    456489        } 
    457490        if (stackO != null) { 
    458491          if (!mergeChannels && splitWindows) { 
    459             slice(stackO, id, sizeZ, channels, sizeT, fi, r, specifyRanges); 
    460           } 
    461           else imp = new ImagePlus(name, stackO); 
     492            slice(stackO, id, sizeZ, channels, sizeT, 
     493              fi, r, specifyRanges, colorize); 
     494          } 
     495          else imp = new ImagePlus(imageName, stackO); 
    462496        } 
    463497 
     
    529563        long endTime = System.currentTimeMillis(); 
    530564        double elapsed = (endTime - startTime) / 1000.0; 
    531         if (num == 1) { 
     565        if (num[i] == 1) { 
    532566          IJ.showStatus("LOCI Bio-Formats: " + elapsed + " seconds"); 
    533567        } 
    534568        else { 
    535           long average = (endTime - startTime) / num; 
     569          long average = (endTime - startTime) / num[i]; 
    536570          IJ.showStatus("LOCI Bio-Formats: " + elapsed + " seconds (" + 
    537571            average + " ms per plane)"); 
     
    541575      r.close(); 
    542576      plugin.success = true; 
    543       doRGBMerge = false; 
    544  
    545       // save checkbox values to IJ_Prefs.txt 
    546  
     577 
     578      // save parameter values to IJ_Prefs.txt 
    547579      Prefs.set("bioformats.mergeChannels", mergeChannels); 
    548580      Prefs.set("bioformats.ignoreTables", ignoreTables); 
     
    552584      Prefs.set("bioformats.stitchFiles", stitchFiles); 
    553585      Prefs.set("bioformats.specifyRanges", specifyRanges); 
    554  
    555       mergeChannels = true; 
    556       splitWindows = false; 
    557586    } 
    558587    catch (Exception exc) { 
     
    567596  } 
    568597 
    569   // -- ItemListener API methods -- 
    570  
    571   public void itemStateChanged(ItemEvent e) { 
    572     Object source = e.getItemSelectable(); 
    573     boolean selected = e.getStateChange() == ItemEvent.SELECTED; 
    574     if (source == merge) mergeChannels = selected; 
    575     else if (source == ignore) ignoreTables = selected; 
    576     else if (source == colorizeChannels) colorize = selected; 
    577     else if (source == newWindows) splitWindows = selected; 
    578     else if (source == showMeta) showMetadata = selected; 
    579     else if (source == stitching) stitchFiles = selected; 
    580     else if (source == ranges) specifyRanges = selected; 
    581     else { 
    582       if (series != null) { 
    583         for (int i=0; i<boxes.length; i++) { 
    584           if (source == boxes[i]) { 
    585             series[i] = selected; 
    586             return; 
    587           } 
    588         } 
    589       } 
    590     } 
    591   } 
    592  
    593   // -- ActionListener API methods -- 
    594  
    595   public void actionPerformed(ActionEvent e) { 
    596     Object source = e.getSource(); 
    597     if (source == okButton) seriesFrame.dispose(); 
    598   } 
    599  
    600598  // -- Helper methods -- 
    601599 
    602   private void slice(ImageStack is, String file, int z, int c, int t, 
    603     FileInfo fi, IFormatReader r, boolean range) 
     600  private void slice(ImageStack is, String id, int z, int c, int t, 
     601    FileInfo fi, IFormatReader r, boolean range, boolean colorize) 
    604602    throws FormatException, IOException 
    605603  { 
    606  
    607604    int step = 1; 
    608605    if (range) { 
    609606      step = c; 
    610       c = r.getSizeC(file); 
     607      c = r.getSizeC(id); 
    611608    } 
    612609 
     
    628625        for (int j=0; j<z; j++) { 
    629626          for (int k=0; k<t; k++) { 
    630             int s = r.getIndex(file, j, i, k) + 1; 
     627            int s = r.getIndex(id, j, i, k) + 1; 
    631628            newStacks[i].addSlice(is.getSliceLabel(s), is.getProcessor(s)); 
    632629          } 
     
    638635 
    639636    OMEXMLMetadataStore store = 
    640       (OMEXMLMetadataStore) r.getMetadataStore(file); 
     637      (OMEXMLMetadataStore) r.getMetadataStore(id); 
    641638    double xcal = Double.NaN, ycal = Double.NaN, zcal = Double.NaN; 
    642     Integer ii = new Integer(r.getSeries(file)); 
     639    Integer ii = new Integer(r.getSeries(id)); 
    643640 
    644641    Float xf = store.getPixelSizeX(ii); 
     
    650647 
    651648    for (int i=0; i<newStacks.length; i++) { 
    652       ImagePlus imp = new ImagePlus(file + " - Ch" + (i+1), newStacks[i]); 
     649      ImagePlus imp = new ImagePlus(id + " - Ch" + (i+1), newStacks[i]); 
    653650 
    654651      if (xcal != Double.NaN || ycal != Double.NaN || zcal != Double.NaN) { 
     
    669666      } 
    670667 
    671  
    672       // mostly copied from the ImageJ source 
     668      // colorize channels; mostly copied from the ImageJ source 
    673669  
    674670      if (colorize) { 
     
    698694  } 
    699695 
     696  private void addScrollBars(Container pane) { 
     697    LayoutManager layout = pane.getLayout(); 
     698    int count = pane.getComponentCount(); 
     699    Component[] c = new Component[count]; 
     700    for (int i=0; i<count; i++) c[i] = pane.getComponent(i); 
     701    pane.removeAll(); 
     702    pane.setLayout(new BorderLayout()); 
     703 
     704    Panel newPane = new Panel(); 
     705    newPane.setLayout(layout); 
     706    for (int i=0; i<count; i++) newPane.add(c[i]); 
     707    ScrollPane scroll = new ScrollPane(); 
     708    scroll.add(newPane); 
     709    pane.add(scroll, BorderLayout.CENTER); 
     710  } 
     711 
    700712} 
Note: See TracChangeset for help on using the changeset viewer.