Changeset 6131


Ignore:
Timestamp:
04/16/10 17:43:15 (10 years ago)
Author:
curtis
Message:

More progress on Bio-Formats Importer. Probably breaks some options.

Location:
trunk/components/loci-plugins/src/loci/plugins
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/loci-plugins/src/loci/plugins/importer/ImagePlusReader.java

    r6130 r6131  
    2929import ij.ImagePlus; 
    3030import ij.ImageStack; 
    31 import ij.WindowManager; 
    3231import ij.io.FileInfo; 
    33 import ij.plugin.filter.PlugInFilterRunner; 
    3432import ij.process.ByteProcessor; 
    3533import ij.process.ColorProcessor; 
     
    4341import java.io.IOException; 
    4442import java.util.ArrayList; 
     43import java.util.List; 
    4544 
    4645import loci.common.Location; 
    47 import loci.common.ReflectException; 
    48 import loci.common.ReflectedUniverse; 
    4946import loci.common.services.DependencyException; 
    5047import loci.common.services.ServiceException; 
     
    5754import loci.formats.meta.IMetadata; 
    5855import loci.formats.services.OMEXMLService; 
    59 import loci.plugins.Colorizer; 
    6056import loci.plugins.util.BFVirtualStack; 
    61 import loci.plugins.util.DataBrowser; 
    6257import loci.plugins.util.ImagePlusTools; 
    6358import loci.plugins.util.ImageProcessorReader; 
    6459import loci.plugins.util.VirtualImagePlus; 
    6560import loci.plugins.util.VirtualReader; 
    66 import loci.plugins.util.WindowTools; 
    6761 
    6862/** 
     
    8074  protected ImporterOptions options; 
    8175 
     76  public String stackOrder;//TEMP! 
     77  public IndexColorModel[] colorModels;//TEMP! 
     78   
    8279  // -- Constructors -- 
    8380 
     
    9895 
    9996  /** 
    100    * Creates an ImageJ image processor object 
    101    * for the image plane at the given position. 
     97   * Opens one or more {@link ij.ImagePlus} objects 
     98   * corresponding to the reader's associated options. 
    10299   */ 
    103   public ImagePlus[] openImagePlus() 
     100  public ImagePlus[] openImagePlus() throws FormatException, IOException { 
     101    List<ImagePlus> imps = readPixelData(); 
     102    return imps.toArray(new ImagePlus[0]); 
     103  } 
     104 
     105  // -- Helper methods -- 
     106 
     107  private List<ImagePlus> readPixelData() 
    104108    throws FormatException, IOException 
    105109  { 
    106     readPixelData(); 
    107     // TODO - disentangle data and display logic 
    108     return null; 
    109   } 
    110  
    111   private void readPixelData() throws FormatException, IOException 
    112   { 
    113110    ImageProcessorReader r = options.getReader(); 
    114     ArrayList<ImagePlus> imps = new ArrayList<ImagePlus>(); 
    115     String stackOrder = null; 
    116     IndexColorModel[] colorModels = null; 
     111    List<ImagePlus> imps = new ArrayList<ImagePlus>(); 
     112    stackOrder = null; 
     113    colorModels = null; 
    117114 
    118115    if (options.isVirtual()) { 
     
    172169      int w = options.doCrop() ? cropRegion.width : r.getSizeX(); 
    173170      int h = options.doCrop() ? cropRegion.height : r.getSizeY(); 
    174       int c = r.getRGBChannelCount(); 
    175       int type = r.getPixelType(); 
    176171 
    177172      int q = 0; 
     
    185180 
    186181      // dump OME-XML to ImageJ's description field, if available 
    187  
    188182      try { 
    189183        ServiceFactory factory = new ServiceFactory(); 
     
    195189 
    196190      if (options.isVirtual()) { 
    197         int cSize = r.getSizeC(); 
    198         int pt = r.getPixelType(); 
    199191        boolean doMerge = options.isMergeChannels(); 
    200         boolean eight = pt != FormatTools.UINT8 && pt != FormatTools.INT8; 
    201         boolean needComposite = doMerge && (cSize > 3 || eight); 
    202         int merge = (needComposite || !doMerge) ? 1 : cSize; 
    203192 
    204193        r.setSeries(s); 
     
    298287      IJ.showProgress(1); 
    299288 
    300       showStack(stackB, s, fi, options, imps, stackOrder, colorModels); 
    301       showStack(stackS, s, fi, options, imps, stackOrder, colorModels); 
    302       showStack(stackF, s, fi, options, imps, stackOrder, colorModels); 
    303       showStack(stackO, s, fi, options, imps, stackOrder, colorModels); 
     289      ImagePlus impB = createImage(stackB, s, fi, stackOrder, colorModels); 
     290      ImagePlus impS = createImage(stackS, s, fi, stackOrder, colorModels); 
     291      ImagePlus impF = createImage(stackF, s, fi, stackOrder, colorModels); 
     292      ImagePlus impO = createImage(stackO, s, fi, stackOrder, colorModels); 
     293      if (impB != null) imps.add(impB); 
     294      if (impS != null) imps.add(impS); 
     295      if (impF != null) imps.add(impF); 
     296      if (impO != null) imps.add(impO); 
    304297 
    305298      long endTime = System.currentTimeMillis(); 
     
    315308    } 
    316309 
    317     if (options.isConcatenate()) { 
    318       ArrayList<Integer> widths = new ArrayList<Integer>(); 
    319       ArrayList<Integer> heights = new ArrayList<Integer>(); 
    320       ArrayList<Integer> types = new ArrayList<Integer>(); 
    321       ArrayList<ImagePlus> newImps = new ArrayList<ImagePlus>(); 
    322  
    323       for (int j=0; j<imps.size(); j++) { 
    324         ImagePlus imp = imps.get(j); 
    325         int wj = imp.getWidth(); 
    326         int hj = imp.getHeight(); 
    327         int tj = imp.getBitDepth(); 
    328         boolean append = false; 
    329         for (int k=0; k<widths.size(); k++) { 
    330           int wk = ((Integer) widths.get(k)).intValue(); 
    331           int hk = ((Integer) heights.get(k)).intValue(); 
    332           int tk = ((Integer) types.get(k)).intValue(); 
    333  
    334           if (wj == wk && hj == hk && tj == tk) { 
    335             ImagePlus oldImp = newImps.get(k); 
    336             ImageStack is = oldImp.getStack(); 
    337             ImageStack newStack = imp.getStack(); 
    338             for (int s=0; s<newStack.getSize(); s++) { 
    339               is.addSlice(newStack.getSliceLabel(s + 1), 
    340                 newStack.getProcessor(s + 1)); 
    341             } 
    342             oldImp.setStack(oldImp.getTitle(), is); 
    343             newImps.set(k, oldImp); 
    344             append = true; 
    345             k = widths.size(); 
     310    imps = concatenate(imps, stackOrder); 
     311 
     312    return imps; 
     313  } 
     314 
     315  /** 
     316   * Displays the given image stack according to 
     317   * the specified parameters and import options. 
     318   */ 
     319  private ImagePlus createImage(ImageStack stack, 
     320    int series, FileInfo fi, String stackOrder, IndexColorModel[] colorModels) 
     321    throws FormatException, IOException 
     322  { 
     323    if (stack == null) return null; 
     324 
     325    String seriesName = options.getOMEMetadata().getImageName(series); 
     326    String file = options.getCurrentFile(); 
     327    IMetadata meta = options.getOMEMetadata(); 
     328    int cCount = options.getCCount(series); 
     329    int zCount = options.getZCount(series); 
     330    int tCount = options.getTCount(series); 
     331    IFormatReader r = options.getReader(); 
     332 
     333    String title = getTitle(r, file, seriesName, options.isGroupFiles()); 
     334    ImagePlus imp = null; 
     335    if (options.isVirtual()) { 
     336      imp = new VirtualImagePlus(title, stack); 
     337      ((VirtualImagePlus) imp).setReader(r); 
     338    } 
     339    else imp = new ImagePlus(title, stack); 
     340 
     341    // place metadata key/value pairs in ImageJ's info field 
     342    String metadata = options.getOriginalMetadata().toString(); 
     343    imp.setProperty("Info", metadata); 
     344 
     345    // retrieve the spatial calibration information, if available 
     346    ImagePlusTools.applyCalibration(meta, imp, r.getSeries()); 
     347    imp.setFileInfo(fi); 
     348    imp.setDimensions(cCount, zCount, tCount); 
     349 
     350    boolean hyper = options.isViewHyperstack() || options.isViewBrowser(); 
     351    imp.setOpenAsHyperStack(hyper); 
     352    int nSlices = imp.getNSlices(); 
     353    int nFrames = imp.getNFrames(); 
     354 
     355    if (options.isAutoscale() && !options.isVirtual()) { 
     356      ImagePlusTools.adjustColorRange(imp, r); 
     357    } 
     358    else if (!(imp.getProcessor() instanceof ColorProcessor)) { 
     359      // ImageJ may autoscale the images anyway, so we need to manually 
     360      // set the display range to the min/max values allowed for 
     361      // this pixel type 
     362      imp.setDisplayRange(0, Math.pow(2, imp.getBitDepth()) - 1); 
     363    } 
     364 
     365    imp.setDimensions(imp.getStackSize() / (nSlices * nFrames), 
     366      nSlices, nFrames); 
     367 
     368    return imp; 
     369  } 
     370 
     371  /** Get an appropriate stack title, given the file name. */ 
     372  private String getTitle(IFormatReader r, String file, String seriesName, 
     373    boolean groupFiles) 
     374  { 
     375    String[] used = r.getUsedFiles(); 
     376    String title = file.substring(file.lastIndexOf(File.separator) + 1); 
     377    if (used.length > 1 && groupFiles) { 
     378      FilePattern fp = new FilePattern(new Location(file)); 
     379      if (fp != null) { 
     380        title = fp.getPattern(); 
     381        if (title == null) { 
     382          title = file; 
     383          if (title.indexOf(".") != -1) { 
     384            title = title.substring(0, title.lastIndexOf(".")); 
    346385          } 
    347386        } 
    348         if (!append) { 
    349           widths.add(new Integer(wj)); 
    350           heights.add(new Integer(hj)); 
    351           types.add(new Integer(tj)); 
    352           newImps.add(imp); 
    353         } 
    354       } 
    355  
    356       boolean splitC = options.isSplitChannels(); 
    357       boolean splitZ = options.isSplitFocalPlanes(); 
    358       boolean splitT = options.isSplitTimepoints(); 
    359  
    360       for (int j=0; j<newImps.size(); j++) { 
    361         ImagePlus imp = (ImagePlus) newImps.get(j); 
    362         imp.show(); 
    363         if (splitC || splitZ || splitT) { 
    364           IJ.runPlugIn("loci.plugins.Slicer", "slice_z=" + splitZ + 
    365             " slice_c=" + splitC + " slice_t=" + splitT + 
    366             " stack_order=" + stackOrder + " keep_original=false " + 
    367             "hyper_stack=" + options.isViewHyperstack() + " "); 
    368           imp.close(); 
    369         } 
    370         if (options.isMergeChannels() && options.isWindowless()) { 
    371           IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
    372             " merge=true merge_option=[" + options.getMergeOption() + "] " + 
    373             "series=" + r.getSeries() + " hyper_stack=" + 
    374             options.isViewHyperstack() + " "); 
    375           imp.close(); 
    376         } 
    377         else if (options.isMergeChannels()) { 
    378           IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
    379             " merge=true series=" + r.getSeries() + " hyper_stack=" + 
    380             options.isViewHyperstack() + " "); 
    381           imp.close(); 
    382         } 
    383       } 
    384     } 
    385   } 
    386    
     387        title = title.substring(title.lastIndexOf(File.separator) + 1); 
     388      } 
     389    } 
     390    if (seriesName != null && !file.endsWith(seriesName) && 
     391      r.getSeriesCount() > 1) 
     392    { 
     393      title += " - " + seriesName; 
     394    } 
     395    if (title.length() > 128) { 
     396      String a = title.substring(0, 62); 
     397      String b = title.substring(title.length() - 62); 
     398      title = a + "..." + b; 
     399    } 
     400    return title; 
     401  } 
     402 
    387403  /** Constructs slice label. */ 
    388404  private String constructSliceLabel(int ndx, IFormatReader r, 
     
    434450  } 
    435451 
    436    
    437   /** 
    438    * Displays the given image stack according to 
    439    * the specified parameters and import options. 
    440    */ 
    441   private void showStack(ImageStack stack, int series, FileInfo fi, 
    442     ImporterOptions options, ArrayList<ImagePlus> imps, 
    443     String stackOrder, IndexColorModel[] colorModels) 
    444     throws FormatException, IOException 
    445   { 
    446     if (stack == null) return; 
    447  
    448     String seriesName = options.getOMEMetadata().getImageName(series); 
    449     String file = options.getCurrentFile(); 
    450     IMetadata meta = options.getOMEMetadata(); 
    451     int cCount = options.getCCount(series); 
    452     int zCount = options.getZCount(series); 
    453     int tCount = options.getTCount(series); 
     452  /** Concatenates the list of images as appropriate. */ 
     453  private List<ImagePlus> concatenate(List<ImagePlus> imps, String stackOrder) { 
     454    if (!options.isConcatenate()) return imps; 
     455 
    454456    IFormatReader r = options.getReader(); 
    455     int sizeZ = r.getSizeZ(); 
    456     int sizeC = r.getEffectiveSizeC(); 
    457     int sizeT = r.getSizeT(); 
    458     boolean windowless = options.isWindowless(); 
    459  
    460     String title = getTitle(r, file, seriesName, options.isGroupFiles()); 
    461     ImagePlus imp = null; 
    462     if (options.isVirtual()) { 
    463       imp = new VirtualImagePlus(title, stack); 
    464       ((VirtualImagePlus) imp).setReader(r); 
    465     } 
    466     else imp = new ImagePlus(title, stack); 
    467  
    468     // place metadata key/value pairs in ImageJ's info field 
    469     String metadata = options.getOriginalMetadata().toString(); 
    470     imp.setProperty("Info", metadata); 
    471  
    472     // retrieve the spatial calibration information, if available 
    473     ImagePlusTools.applyCalibration(meta, imp, r.getSeries()); 
    474     imp.setFileInfo(fi); 
    475     imp.setDimensions(cCount, zCount, tCount); 
    476  
    477     // display the image stack using the appropriate plugin 
    478  
    479     boolean hyper = options.isViewHyperstack() || options.isViewBrowser(); 
    480     imp.setOpenAsHyperStack(hyper); 
    481     int nSlices = imp.getNSlices(); 
    482     int nFrames = imp.getNFrames(); 
    483  
    484     if (options.isAutoscale() && !options.isVirtual()) { 
    485       ImagePlusTools.adjustColorRange(imp, r); 
    486     } 
    487     else if (!(imp.getProcessor() instanceof ColorProcessor)) { 
    488       // ImageJ may autoscale the images anyway, so we need to manually 
    489       // set the display range to the min/max values allowed for 
    490       // this pixel type 
    491       imp.setDisplayRange(0, Math.pow(2, imp.getBitDepth()) - 1); 
     457 
     458    List<Integer> widths = new ArrayList<Integer>(); 
     459    List<Integer> heights = new ArrayList<Integer>(); 
     460    List<Integer> types = new ArrayList<Integer>(); 
     461    List<ImagePlus> newImps = new ArrayList<ImagePlus>(); 
     462 
     463    for (int j=0; j<imps.size(); j++) { 
     464      ImagePlus imp = imps.get(j); 
     465      int wj = imp.getWidth(); 
     466      int hj = imp.getHeight(); 
     467      int tj = imp.getBitDepth(); 
     468      boolean append = false; 
     469      for (int k=0; k<widths.size(); k++) { 
     470        int wk = ((Integer) widths.get(k)).intValue(); 
     471        int hk = ((Integer) heights.get(k)).intValue(); 
     472        int tk = ((Integer) types.get(k)).intValue(); 
     473 
     474        if (wj == wk && hj == hk && tj == tk) { 
     475          ImagePlus oldImp = newImps.get(k); 
     476          ImageStack is = oldImp.getStack(); 
     477          ImageStack newStack = imp.getStack(); 
     478          for (int s=0; s<newStack.getSize(); s++) { 
     479            is.addSlice(newStack.getSliceLabel(s + 1), 
     480              newStack.getProcessor(s + 1)); 
     481          } 
     482          oldImp.setStack(oldImp.getTitle(), is); 
     483          newImps.set(k, oldImp); 
     484          append = true; 
     485          k = widths.size(); 
     486        } 
     487      } 
     488      if (!append) { 
     489        widths.add(new Integer(wj)); 
     490        heights.add(new Integer(hj)); 
     491        types.add(new Integer(tj)); 
     492        newImps.add(imp); 
     493      } 
    492494    } 
    493495 
     
    496498    boolean splitT = options.isSplitTimepoints(); 
    497499 
    498     int z = r.getSizeZ(); 
    499     int c = r.getSizeC(); 
    500     int t = r.getSizeT(); 
    501  
    502     if (!options.isConcatenate() && options.isMergeChannels()) imp.show(); 
    503  
    504     if (imp.isVisible() && !options.isVirtual()) { 
    505       String arg = "stack_order=" + stackOrder + " merge=true series=" + 
    506         r.getSeries() + " hyper_stack=" + options.isViewHyperstack(); 
    507       if (windowless) arg += " merge_option=[" + options.getMergeOption() + "]"; 
    508       arg += " "; 
    509       IJ.runPlugIn("loci.plugins.Colorizer", arg); 
    510       if (WindowManager.getCurrentImage().getID() != imp.getID()) { 
     500    // TODO: Change IJ.runPlugIn to direct API calls in relevant plugins. 
     501    // Should not be calling show() here just to make other plugins happy! :-( 
     502    for (int j=0; j<newImps.size(); j++) { 
     503      ImagePlus imp = (ImagePlus) newImps.get(j); 
     504      imp.show(); 
     505      if (splitC || splitZ || splitT) { 
     506        IJ.runPlugIn("loci.plugins.Slicer", "slice_z=" + splitZ + 
     507          " slice_c=" + splitC + " slice_t=" + splitT + 
     508          " stack_order=" + stackOrder + " keep_original=false " + 
     509          "hyper_stack=" + options.isViewHyperstack() + " "); 
    511510        imp.close(); 
    512511      } 
    513     } 
    514  
    515     imp.setDimensions(imp.getStackSize() / (nSlices * nFrames), 
    516       nSlices, nFrames); 
    517  
    518     if (options.isViewVisBio()) { 
    519       // NB: avoid dependency on optional loci.visbio packages 
    520       ReflectedUniverse ru = new ReflectedUniverse(); 
    521       try { 
    522         ru.exec("import loci.visbio.data.Dataset"); 
    523         //ru.setVar("name", name); 
    524         //ru.setVar("pattern", pattern); 
    525         ru.exec("dataset = new Dataset(name, pattern)"); 
    526         // TODO: finish VisBio logic 
    527       } 
    528       catch (ReflectException exc) { 
    529         WindowTools.reportException(exc, options.isQuiet(), 
    530           "Sorry, there was a problem interfacing with VisBio"); 
    531         return; 
    532       } 
    533     } 
    534     else if (options.isViewImage5D()) { 
    535       ReflectedUniverse ru = new ReflectedUniverse(); 
    536       try { 
    537         ru.exec("import i5d.Image5D"); 
    538         ru.setVar("title", imp.getTitle()); 
    539         ru.setVar("stack", imp.getStack()); 
    540         ru.setVar("sizeC", c); 
    541         ru.setVar("sizeZ", z); 
    542         ru.setVar("sizeT", t); 
    543         ru.exec("i5d = new Image5D(title, stack, sizeC, sizeZ, sizeT)"); 
    544         ru.setVar("cal", imp.getCalibration()); 
    545         ru.setVar("fi", imp.getOriginalFileInfo()); 
    546         ru.exec("i5d.setCalibration(cal)"); 
    547         ru.exec("i5d.setFileInfo(fi)"); 
    548         //ru.exec("i5d.setDimensions(sizeC, sizeZ, sizeT)"); 
    549         ru.exec("i5d.show()"); 
    550       } 
    551       catch (ReflectException exc) { 
    552         WindowTools.reportException(exc, options.isQuiet(), 
    553           "Sorry, there was a problem interfacing with Image5D"); 
    554         return; 
    555       } 
    556     } 
    557     else if (options.isViewView5D()) { 
    558       WindowManager.setTempCurrentImage(imp); 
    559       IJ.run("start viewer", ""); 
    560     } 
    561     else { 
    562       // NB: ImageJ 1.39+ is required for hyperstacks 
    563  
    564       if (!options.isConcatenate()) { 
    565         if (options.isViewBrowser()) { 
    566           DataBrowser dataBrowser = new DataBrowser(imp, null, 
    567             r.getChannelDimTypes(), r.getChannelDimLengths()); 
    568           if (options.isShowOMEXML()) dataBrowser.showMetadataWindow(); 
    569         } 
    570         else if (!imp.isVisible()) imp.show(); 
    571  
    572         boolean customColorize = options.isCustomColorize(); 
    573         boolean browser = options.isViewBrowser(); 
    574         boolean virtual = options.isVirtual(); 
    575  
    576         if (options.isColorize() || customColorize) { 
    577           IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
    578             " merge=false colorize=true ndx=" + (customColorize ? "-1" : "0") + 
    579             " series=" + r.getSeries() + " hyper_stack=" + 
    580             options.isViewHyperstack() + " "); 
    581           imp.close(); 
    582         } 
    583         else if (colorModels != null && !browser && !virtual) { 
    584           Colorizer colorizer = new Colorizer(); 
    585           String arg = "stack_order=" + stackOrder + " merge=false " + 
    586             "colorize=true series=" + r.getSeries() + " hyper_stack=" + 
    587             hyper + " "; 
    588           colorizer.setup(arg, imp); 
    589           for (int channel=0; channel<colorModels.length; channel++) { 
    590             byte[][] lut = new byte[3][256]; 
    591             colorModels[channel].getReds(lut[0]); 
    592             colorModels[channel].getGreens(lut[1]); 
    593             colorModels[channel].getBlues(lut[2]); 
    594             colorizer.setLookupTable(lut, channel); 
    595           } 
    596           new PlugInFilterRunner(colorizer, "", arg); 
    597           imp.close(); 
    598         } 
    599  
    600         if (splitC || splitZ || splitT) { 
    601           IJ.runPlugIn("loci.plugins.Slicer", "slice_z=" + splitZ + 
    602             " slice_c=" + splitC + " slice_t=" + splitT + 
    603             " stack_order=" + stackOrder + " keep_original=false " + 
    604             "hyper_stack=" + hyper + " "); 
    605           imp.close(); 
    606         } 
    607       } 
    608       imps.add(imp); 
    609     } 
    610   } 
    611  
    612   /** Get an appropriate stack title, given the file name. */ 
    613   private String getTitle(IFormatReader r, String file, String seriesName, 
    614     boolean groupFiles) 
    615   { 
    616     String[] used = r.getUsedFiles(); 
    617     String title = file.substring(file.lastIndexOf(File.separator) + 1); 
    618     if (used.length > 1 && groupFiles) { 
    619       FilePattern fp = new FilePattern(new Location(file)); 
    620       if (fp != null) { 
    621         title = fp.getPattern(); 
    622         if (title == null) { 
    623           title = file; 
    624           if (title.indexOf(".") != -1) { 
    625             title = title.substring(0, title.lastIndexOf(".")); 
    626           } 
    627         } 
    628         title = title.substring(title.lastIndexOf(File.separator) + 1); 
    629       } 
    630     } 
    631     if (seriesName != null && !file.endsWith(seriesName) && 
    632       r.getSeriesCount() > 1) 
    633     { 
    634       title += " - " + seriesName; 
    635     } 
    636     if (title.length() > 128) { 
    637       String a = title.substring(0, 62); 
    638       String b = title.substring(title.length() - 62); 
    639       title = a + "..." + b; 
    640     } 
    641     return title; 
     512      if (options.isMergeChannels() && options.isWindowless()) { 
     513        IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
     514          " merge=true merge_option=[" + options.getMergeOption() + "] " + 
     515          "series=" + r.getSeries() + " hyper_stack=" + 
     516          options.isViewHyperstack() + " "); 
     517        imp.close(); 
     518      } 
     519      else if (options.isMergeChannels()) { 
     520        IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
     521          " merge=true series=" + r.getSeries() + " hyper_stack=" + 
     522          options.isViewHyperstack() + " "); 
     523        imp.close(); 
     524      } 
     525    } 
     526 
     527    return newImps; 
    642528  } 
    643529 
  • trunk/components/loci-plugins/src/loci/plugins/importer/Importer.java

    r6130 r6131  
    2626package loci.plugins.importer; 
    2727 
    28 import ij.IJ; 
    2928import ij.ImageJ; 
    3029import ij.ImagePlus; 
    3130 
    32 import java.awt.image.IndexColorModel; 
    3331import java.io.IOException; 
    34 import java.util.ArrayList; 
    3532 
    36 import javax.xml.parsers.ParserConfigurationException; 
    37  
    38 import loci.common.services.DependencyException; 
    39 import loci.common.services.ServiceException; 
    40 import loci.common.services.ServiceFactory; 
    4133import loci.formats.FormatException; 
    42 import loci.formats.gui.XMLWindow; 
    43 import loci.formats.services.OMEXMLService; 
    4434import loci.plugins.LociImporter; 
    4535import loci.plugins.util.BF; 
    4636import loci.plugins.util.ROIHandler; 
    4737import loci.plugins.util.WindowTools; 
    48  
    49 import org.xml.sax.SAXException; 
    5038 
    5139/** 
     
    6957  private LociImporter plugin; 
    7058 
    71   private ArrayList<ImagePlus> imps = new ArrayList<ImagePlus>(); 
    72   private String stackOrder = null; 
    73  
    74   private IndexColorModel[] colorModels; 
    75  
    7659  // -- Constructor -- 
    7760 
     
    9477      if (plugin.canceled) return; 
    9578 
    96       if (options.isShowMetadata()) { 
    97         BF.debug("display metadata"); 
    98         IJ.showStatus("Populating metadata"); 
    99         displayOriginalMetadata(options); 
    100         if (plugin.canceled) return; 
    101       } 
    102       else BF.debug("skip metadata"); 
     79      BF.debug("display metadata"); 
     80      DisplayHandler displayHandler = new DisplayHandler(options); 
     81      displayHandler.displayOriginalMetadata(); 
     82      displayHandler.displayOMEXML(); 
    10383 
    104       if (options.isShowOMEXML()) { 
    105         BF.debug("show OME-XML"); 
    106         displayOMEXML(options); 
    107         if (plugin.canceled) return; 
    108       } 
    109       else BF.debug("skip OME-XML"); 
     84      BF.debug("read pixel data"); 
     85      ImagePlus[] imps = readPixels(options, displayHandler); 
    11086 
    111       if (!options.isViewNone()) { 
    112         BF.debug("read pixel data"); 
    113         readPixelData(options); 
    114         if (plugin.canceled) return; 
    115       } 
    116       else BF.debug("skip pixel data"); // nothing to display 
    117  
    118       if (options.showROIs()) { 
    119         BF.debug("display ROIs"); 
    120         displayROIs(options); 
    121         if (plugin.canceled) return; 
    122       } 
    123       else BF.debug("skip ROIs"); 
     87      BF.debug("display ROIs"); 
     88      displayHandler.displayROIs(imps); 
    12489 
    12590      BF.debug("finish"); 
    12691      finish(options); 
    127       if (plugin.canceled) return; 
    12892    } 
    12993    catch (FormatException exc) { 
     
    160124    throws IOException 
    161125  { 
    162     ImporterMetadata meta = options.getOriginalMetadata(); 
    163     meta.showMetadataWindow(options.getIdName()); 
     126    DisplayHandler displayHandler = new DisplayHandler(options); 
     127    displayHandler.displayOriginalMetadata(); 
    164128  } 
    165129 
     
    167131    throws FormatException, IOException 
    168132  { 
    169     if (options.isViewBrowser()) { 
    170       // NB: Data Browser has its own internal OME-XML metadata window, 
    171       // which we'll trigger once we have created a Data Browser. 
    172       // So there is no need to pop up a separate OME-XML here. 
    173     } 
    174     else { 
    175       XMLWindow metaWindow = 
    176         new XMLWindow("OME Metadata - " + options.getIdName()); 
    177       Exception exc = null; 
    178       try { 
    179         ServiceFactory factory = new ServiceFactory(); 
    180         OMEXMLService service = factory.getInstance(OMEXMLService.class); 
    181         metaWindow.setXML(service.getOMEXML(options.getOMEMetadata())); 
    182         WindowTools.placeWindow(metaWindow); 
    183         metaWindow.setVisible(true); 
    184       } 
    185       catch (DependencyException e) { exc = e; } 
    186       catch (ServiceException e) { exc = e; } 
    187       catch (ParserConfigurationException e) { exc = e; } 
    188       catch (SAXException e) { exc = e; } 
    189  
    190       if (exc != null) throw new FormatException(exc); 
    191     } 
     133    DisplayHandler displayHandler = new DisplayHandler(options); 
     134    displayHandler.displayOMEXML(); 
     135    // TODO - register resultant XMLWindow with Data Browser when relevant. 
    192136  } 
    193137 
    194   public void readPixelData(ImporterOptions options) 
    195     throws FormatException, IOException 
     138  public ImagePlus[] readPixels(ImporterOptions options, 
     139    DisplayHandler displayHandler) throws FormatException, IOException 
    196140  { 
     141    if (options.isViewNone()) return null; 
    197142    ImagePlusReader ipr = new ImagePlusReader(options); 
    198     ipr.openImagePlus(); 
    199     // TODO - migrate display logic here 
     143    ImagePlus[] imps = ipr.openImagePlus(); 
     144 
     145    // TEMP! 
     146    displayHandler.displayImages(imps, ipr.stackOrder, ipr.colorModels); 
     147     
     148    return imps; 
    200149  } 
    201150 
    202   public void displayROIs(ImporterOptions options) { 
     151  public void displayROIs(ImporterOptions options, ImagePlus[] imps) { 
    203152    if (options.showROIs()) { 
    204153      BF.debug("display ROIs"); 
    205  
    206       ImagePlus[] impsArray = imps.toArray(new ImagePlus[0]); 
    207       ROIHandler.openROIs(options.getOMEMetadata(), impsArray); 
     154      ROIHandler.openROIs(options.getOMEMetadata(), imps); 
    208155    } 
    209156    else BF.debug("skip ROIs"); 
  • trunk/components/loci-plugins/src/loci/plugins/importer/ImporterMetadata.java

    r6128 r6131  
    3434import loci.formats.IFormatReader; 
    3535import loci.formats.MetadataTools; 
    36 import loci.plugins.util.SearchableWindow; 
    3736 
    3837/** 
     
    115114  } 
    116115 
    117   /** Displays the metadata in a searchable window. */ 
    118   public void showMetadataWindow(String name) { 
    119     // sort metadata keys 
    120     String metaString = getMetadataString("\t"); 
    121     SearchableWindow w = new SearchableWindow("Original Metadata - " + name, 
    122       "Key\tValue", metaString, 400, 400); 
    123     w.setVisible(true); 
    124   } 
    125  
    126116  // -- Object API methods -- 
    127117 
  • trunk/components/loci-plugins/src/loci/plugins/util/DataBrowser.java

    r5093 r6131  
    9999 
    100100  public DataBrowser(ImagePlus imp) { 
    101     this(imp, null, null, null); 
     101    this(imp, null, null, null, null); 
    102102  } 
    103103 
     
    105105    String[] channels, int[] cLengths) 
    106106  { 
     107    this(imp, ic, channels, cLengths, null); 
     108  } 
     109 
     110  public DataBrowser(final ImagePlus imp, ImageCanvas ic, 
     111    String[] channels, int[] cLengths, XMLWindow xmlWindow) 
     112  { 
    107113    super(imp, ic); 
    108114 
     
    117123 
    118124    // build metadata window 
    119     metaWindow = new XMLWindow("OME Metadata - " + getTitle()); 
     125    metaWindow = xmlWindow; 
     126    if (metaWindow == null) { 
     127      metaWindow = new XMLWindow("OME Metadata - " + getTitle()); 
     128    } 
    120129 
    121130    // build fancy UI widgets 
Note: See TracChangeset for help on using the changeset viewer.