Changeset 2779


Ignore:
Timestamp:
05/15/07 12:58:02 (13 years ago)
Author:
curtis
Message:

More work on cleaning up importer code. Not done yet.

Location:
trunk/loci/plugins
Files:
2 added
9 edited
1 copied

Legend:

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

    r2178 r2779  
    44 
    55/* 
    6 LOCI Plugins for ImageJ: a collection of ImageJ plugins including 
    7 the 4D Data Browser, OME Plugin and Bio-Formats Exporter. 
     6LOCI Plugins for ImageJ: a collection of ImageJ plugins including the 
     74D Data Browser, Bio-Formats Importer, Bio-Formats Exporter and OME plugins. 
    88Copyright (C) 2006-@year@ Melissa Linkert, Christopher Peterson, 
    99Curtis Rueden, Philip Huettl and Francis Wong. 
     
    4545      "Melissa Linkert and Curtis Rueden.\n" + 
    4646      "http://www.loci.wisc.edu/ome/formats.html\n\n" + 
    47       "The OME Plugin for ImageJ is written by Philip Huettl\n" + 
     47      "The OME plugins for ImageJ are written by Philip Huettl\n" + 
    4848      "and Melissa Linkert.\n" + 
    4949      "http://www.loci.wisc.edu/ome/imagej.html", 
  • trunk/loci/plugins/Checker.java

    r2722 r2779  
    11// 
    2 // Util.java 
     2// Checker.java 
    33// 
    44 
    55/* 
    6 LOCI Plugins for ImageJ: a collection of ImageJ plugins including 
    7 the 4D Data Browser, OME Plugin and Bio-Formats Exporter. 
     6LOCI Plugins for ImageJ: a collection of ImageJ plugins including the 
     74D Data Browser, Bio-Formats Importer, Bio-Formats Exporter and OME plugins. 
    88Copyright (C) 2006-@year@ Melissa Linkert, Christopher Peterson, 
    99Curtis Rueden, Philip Huettl and Francis Wong. 
     
    3030import java.util.Iterator; 
    3131 
    32 /** Utility methods common to multiple plugins. */ 
    33 public final class Util { 
     32/** 
     33 * Utility methods for verifying that classes 
     34 * are present and versions are correct. 
     35 */ 
     36public final class Checker { 
    3437 
    3538  // -- Constants -- 
     
    4952  // -- Constructor -- 
    5053 
    51   private Util() { } 
     54  private Checker() { } 
    5255 
    5356  // -- Utility methods -- 
  • trunk/loci/plugins/Exporter.java

    r2723 r2779  
    44 
    55/* 
    6 LOCI Plugins for ImageJ: a collection of ImageJ plugins including 
    7 the 4D Data Browser, OME Plugin and Bio-Formats Exporter. 
     6LOCI Plugins for ImageJ: a collection of ImageJ plugins including the 
     74D Data Browser, Bio-Formats Importer, Bio-Formats Exporter and OME plugins. 
    88Copyright (C) 2006-@year@ Melissa Linkert, Christopher Peterson, 
    99Curtis Rueden, Philip Huettl and Francis Wong. 
  • trunk/loci/plugins/IJLauncher.java

    r2178 r2779  
    44 
    55/* 
    6 LOCI Plugins for ImageJ: a collection of ImageJ plugins including 
    7 the 4D Data Browser, OME Plugin and Bio-Formats Exporter. 
     6LOCI Plugins for ImageJ: a collection of ImageJ plugins including the 
     74D Data Browser, Bio-Formats Importer, Bio-Formats Exporter and OME plugins. 
    88Copyright (C) 2006-@year@ Melissa Linkert, Christopher Peterson, 
    99Curtis Rueden, Philip Huettl and Francis Wong. 
  • trunk/loci/plugins/Importer.java

    r2777 r2779  
    44 
    55/* 
    6 LOCI Plugins for ImageJ: a collection of ImageJ plugins including 
    7 the 4D Data Browser, OME Plugin and Bio-Formats Exporter. 
     6LOCI Plugins for ImageJ: a collection of ImageJ plugins including the 
     74D Data Browser, Bio-Formats Importer, Bio-Formats Exporter and OME plugins. 
    88Copyright (C) 2006-@year@ Melissa Linkert, Christopher Peterson, 
    99Curtis Rueden, Philip Huettl and Francis Wong. 
     
    2929import ij.gui.GenericDialog; 
    3030import ij.io.FileInfo; 
    31 import ij.io.OpenDialog; 
    3231import ij.measure.Calibration; 
    3332import ij.process.*; 
    3433import ij.text.TextWindow; 
    3534import java.awt.*; 
    36 import java.awt.event.ItemEvent; 
    37 import java.awt.event.ItemListener; 
    3835import java.awt.image.*; 
    39 import java.io.IOException; 
     36import java.io.*; 
    4037import java.util.*; 
    4138import javax.swing.Box; 
    4239import loci.formats.*; 
    43 import loci.formats.codec.LuraWaveCodec; 
    4440import loci.formats.ome.OMEReader; 
    4541import loci.formats.ome.OMEXMLMetadataStore; 
     
    5248 * @author Melissa Linkert linkert at wisc.edu 
    5349 */ 
    54 public class Importer implements ItemListener { 
    55  
    56   // -- Constants -- 
    57  
    58   private static final String VIEW_NONE = "Metadata only"; 
    59   private static final String VIEW_STANDARD = "Standard ImageJ"; 
    60   private static final String VIEW_BROWSER = "4D Data Browser"; 
    61   private static final String VIEW_IMAGE_5D = "Image5D"; 
    62   private static final String VIEW_VIEW_5D = "View5D"; 
    63  
    64   private static final String LOCATION_LOCAL = "Local machine"; 
    65   private static final String LOCATION_HTTP = "Internet"; 
    66   private static final String LOCATION_OME = "OME server"; 
    67   private static final String[] LOCATIONS = { 
    68     LOCATION_LOCAL, LOCATION_HTTP, LOCATION_OME 
    69   }; 
     50public class Importer { 
    7051 
    7152  // -- Fields -- 
     
    7758  private LociImporter plugin; 
    7859 
    79   private Checkbox mergeBox; 
    80   private Checkbox colorizeBox; 
    81   private Checkbox splitBox; 
    82   private Checkbox metadataBox; 
    83   private Checkbox groupBox; 
    84   private Checkbox concatenateBox; 
    85   private Checkbox rangeBox; 
    86   private Choice stackChoice; 
    87  
    8860  private Vector imps = new Vector(); 
    8961 
     
    9668  // -- Importer API methods -- 
    9769 
    98   private boolean getMacroValue(String options, 
    99     String key, boolean defaultValue) 
    100   { 
    101     String s = Macro.getValue(options, key, null); 
    102     return s == null ? defaultValue : s.equalsIgnoreCase("true"); 
    103   } 
    104  
    10570  /** Executes the plugin. */ 
    10671  public void run(String arg) { 
    107     // core option labels 
    108     final String mergeString = "Merge channels to RGB"; 
    109     final String colorizeString = "Colorize channels"; 
    110     final String splitString = "Open each channel in its own window"; 
    111     final String metadataString = "Display associated metadata"; 
    112     final String groupString = "Group files with similar names"; 
    113     final String concatenateString = "Concatenate compatible series"; 
    114     final String rangeString = "Specify range for each series"; 
    115     final String stackString = "View stack with: "; 
    116  
    117     final String locationString = "Location: "; 
    118     final String idString = "Open"; 
    119  
    120     GenericDialog gd; // reusable generic dialog variable 
    12172 
    12273    // -- Step 1: parse core options -- 
    12374 
    124     // load preferences from IJ_Prefs.txt 
    125     boolean mergeChannels = Prefs.get("bioformats.mergeChannels", false); 
    126     boolean colorize = Prefs.get("bioformats.colorize", false); 
    127     boolean splitWindows = Prefs.get("bioformats.splitWindows", true); 
    128     boolean showMetadata = Prefs.get("bioformats.showMetadata", false); 
    129     boolean groupFiles = Prefs.get("bioformats.groupFiles", false); 
    130     boolean concatenate = Prefs.get("bioformats.concatenate", false); 
    131     boolean specifyRanges = Prefs.get("bioformats.specifyRanges", false); 
    132     String stackFormat = Prefs.get("bioformats.stackFormat", VIEW_STANDARD); 
    133  
    134     String location = null; 
    135     String id = null; 
    136     boolean quiet = false; 
    137  
    138     // parse plugin arguments 
    139     if (arg != null && arg.length() > 0) { 
    140       if (new Location(arg).exists()) { 
    141         // old style arg: entire argument is a file path 
    142  
    143         // probably called by HandleExtraFileTypes 
    144  
    145         // NB: This functionality must not be removed, or the plugin 
    146         // will stop working correctly with HandleExtraFileTypes. 
    147  
    148         location = LOCATION_LOCAL; 
    149         id = arg; 
    150         quiet = true; // suppress obnoxious error messages and such 
    151       } 
    152       else { 
    153         // new style arg: split up similar to a macro options string 
    154  
    155         // slightly different than macro options, in that boolean arguments 
    156         // must be of the form "key=true" rather than just "key" 
    157  
    158         // only the core options are supported for now 
    159  
    160         // NB: This functionality enables multiple plugin entries to achieve 
    161         // distinct behavior by calling the LociImporter plugin differently. 
    162  
    163         mergeChannels = getMacroValue(arg, mergeString, mergeChannels); 
    164         colorize = getMacroValue(arg, colorizeString, colorize); 
    165         splitWindows = getMacroValue(arg, colorizeString, splitWindows); 
    166         showMetadata = getMacroValue(arg, metadataString, showMetadata); 
    167         groupFiles = getMacroValue(arg, groupString, groupFiles); 
    168         concatenate = getMacroValue(arg, concatenateString, concatenate); 
    169         specifyRanges = getMacroValue(arg, rangeString, specifyRanges); 
    170         stackFormat = Macro.getValue(arg, stackString, stackFormat); 
    171  
    172         location = Macro.getValue(arg, locationString, location); 
    173         id = Macro.getValue(arg, idString, id); 
    174       } 
    175     } 
    176  
    177     // -- Step 1a: get location (type of data source) -- 
    178  
    179     if (location == null) { 
    180       // open a dialog asking the user what kind of dataset to handle 
    181       // ask only if the location was not already specified somehow 
    182       // ImageJ will grab the value from the macro options, when possible 
    183       gd = new GenericDialog("Bio-Formats Dataset Location"); 
    184       gd.addChoice(locationString, LOCATIONS, LOCATION_LOCAL); 
    185       gd.showDialog(); 
    186       if (gd.wasCanceled()) { 
    187         plugin.canceled = true; 
    188         return; 
    189       } 
    190       location = gd.getNextChoice(); 
    191     } 
    192  
    193     // verify that location is valid 
    194     boolean isLocal = LOCATION_LOCAL.equals(location); 
    195     boolean isHTTP = LOCATION_HTTP.equals(location); 
    196     boolean isOME = LOCATION_OME.equals(location); 
    197     if (!isLocal && !isHTTP && !isOME) { 
    198       if (!quiet) IJ.error("Bio-Formats", "Invalid location: " + location); 
    199       return; 
    200     } 
    201  
    202     // -- Step 1b: get id to open (e.g., filename or URL) -- 
    203  
    204     if (id == null) { 
    205       if (isLocal) { 
    206         // prompt user for the filename (or grab from macro options) 
    207         OpenDialog od = new OpenDialog(idString, id); 
    208         String dir = od.getDirectory(); 
    209         String name = od.getFileName(); 
    210         if (dir == null || name == null) { 
    211           plugin.canceled = true; 
    212           return; 
    213         } 
    214         id = dir + name; 
    215       } 
    216       else if (isHTTP) { 
    217         // prompt user for the URL (or grab from macro options) 
    218         gd = new GenericDialog("Bio-Formats URL"); 
    219         gd.addStringField("URL: ", "http://", 30); 
    220         gd.showDialog(); 
    221         if (gd.wasCanceled()) { 
    222           plugin.canceled = true; 
    223           return; 
    224         } 
    225         id = gd.getNextString(); 
    226       } 
    227       else { // isOME 
    228         IJ.runPlugIn("loci.plugins.OMEPlugin", ""); 
    229         return; 
    230       } 
    231     } 
    232  
    233     // verify that id is valid 
    234     Location idLoc = null; 
    235     String idName = null; 
    236     String idType = null; 
    237     if (isLocal) { 
    238       if (id != null) idLoc = new Location(id); 
    239       if (idLoc == null || !idLoc.exists()) { 
    240         if (!quiet) { 
    241           IJ.error("Bio-Formats", idLoc == null ? 
    242             "No file was specified." : 
    243             "The specified file (" + id + ") does not exist."); 
    244         } 
    245         return; 
    246       } 
    247       idName = idLoc.getName(); 
    248       idType = "Filename"; 
    249     } 
    250     else if (isHTTP) { 
    251       if (id == null) { 
    252         if (!quiet) IJ.error("Bio-Formats", "No URL was specified."); 
    253         return; 
    254       } 
    255       idName = id; 
    256       idType = "URL"; 
    257     } 
    258     else { // isOME 
    259       idType = "OME address"; 
    260     } 
    261  
    262     // -- Step 2: identify file -- 
    263  
    264     // determine whether we can handle this file 
     75    ImporterOptions options = new ImporterOptions(); 
     76    options.loadPreferences(); 
     77    options.parseArg(arg); 
     78 
     79    int status = options.promptLocation(); 
     80    if (!statusOk(status)) return; 
     81    status = options.promptId(); 
     82    if (!statusOk(status)) return; 
     83 
     84    String id = options.getId(); 
     85    boolean quiet = options.isQuiet(); 
     86 
     87    Location idLoc = options.getIdLocation(); 
     88    String idName = options.getIdName(); 
     89    String idType = options.getIdType(); 
     90 
     91    // -- Step 2: construct reader and check id -- 
     92 
    26593    IFormatReader r = null; 
    266     if (isLocal || isHTTP) { 
     94    if (options.isLocal() || options.isHTTP()) { 
    26795      IJ.showStatus("Identifying " + idName); 
    26896      ImageReader reader = new ImageReader(); 
    26997      try { r = reader.getReader(id); } 
    270       catch (Exception exc) { 
    271         exc.printStackTrace(); 
    272         IJ.showStatus(""); 
    273         if (!quiet) { 
    274           String msg = exc.getMessage(); 
    275           IJ.error("Bio-Formats", "Sorry, there was a problem " + 
    276             "reading the file" + (msg == null ? "." : (":\n" + msg))); 
    277         } 
     98      catch (FormatException exc) { 
     99        reportException(exc, quiet, 
     100          "Sorry, there was an error reading the file"); 
    278101        return; 
    279102      } 
    280     } 
    281     else r = new OMEReader(); 
     103      catch (IOException exc) { 
     104        reportException(exc, quiet, 
     105          "Sorry, there was a I/O problem reading the file"); 
     106        return; 
     107      } 
     108    } 
     109    else { // isOME 
     110      r = new OMEReader(); 
     111    } 
    282112    OMEXMLMetadataStore store = new OMEXMLMetadataStore(); 
    283113    r.setMetadataStore(store); 
    284114 
     115    IJ.showStatus(""); 
     116 
    285117    // -- Step 3: get parameter values -- 
    286118 
    287     IJ.showStatus(""); 
    288  
    289     Vector stackTypes = new Vector(); 
    290     stackTypes.add(VIEW_NONE); 
    291     stackTypes.add(VIEW_STANDARD); 
    292     if (Util.checkClass("loci.plugins.browser.LociDataBrowser")) { 
    293       stackTypes.add(VIEW_BROWSER); 
    294     } 
    295     if (Util.checkClass("i5d.Image5D")) stackTypes.add(VIEW_IMAGE_5D); 
    296     if (Util.checkClass("View5D_")) stackTypes.add(VIEW_VIEW_5D); 
    297     final String[] stackFormats = new String[stackTypes.size()]; 
    298     stackTypes.copyInto(stackFormats); 
    299  
    300     // prompt user for parameters (or grab from macro options) 
    301     gd = new GenericDialog("Bio-Formats Import Options"); 
    302     gd.addCheckbox(mergeString, mergeChannels); 
    303     gd.addCheckbox(colorizeString, colorize); 
    304     gd.addCheckbox(splitString, splitWindows); 
    305     gd.addCheckbox(metadataString, showMetadata); 
    306     gd.addCheckbox(groupString, groupFiles); 
    307     gd.addCheckbox(concatenateString, concatenate); 
    308     gd.addCheckbox(rangeString, specifyRanges); 
    309     gd.addChoice(stackString, stackFormats, stackFormat); 
    310  
    311     // extract GUI components from dialog and add listeners 
    312     Vector boxes = gd.getCheckboxes(); 
    313     if (boxes != null) { 
    314       mergeBox = (Checkbox) boxes.get(0); 
    315       colorizeBox = (Checkbox) boxes.get(1); 
    316       splitBox = (Checkbox) boxes.get(2); 
    317       metadataBox = (Checkbox) boxes.get(3); 
    318       groupBox = (Checkbox) boxes.get(4); 
    319       concatenateBox = (Checkbox) boxes.get(5); 
    320       rangeBox = (Checkbox) boxes.get(6); 
    321       for (int i=0; i<boxes.size(); i++) { 
    322         ((Checkbox) boxes.get(i)).addItemListener(this); 
    323       } 
    324     } 
    325     Vector choices = gd.getChoices(); 
    326     if (choices != null) { 
    327       stackChoice = (Choice) choices.get(0); 
    328       for (int i=0; i<choices.size(); i++) { 
    329         ((Choice) choices.get(i)).addItemListener(this); 
    330       } 
    331     } 
    332  
    333     gd.showDialog(); 
    334     if (gd.wasCanceled()) { 
    335       plugin.canceled = true; 
    336       return; 
    337     } 
    338     mergeChannels = gd.getNextBoolean(); 
    339     colorize = gd.getNextBoolean(); 
    340     splitWindows = gd.getNextBoolean(); 
    341     showMetadata = gd.getNextBoolean(); 
    342     groupFiles = gd.getNextBoolean(); 
    343     concatenate = gd.getNextBoolean(); 
    344     specifyRanges = gd.getNextBoolean(); 
    345     stackFormat = stackFormats[gd.getNextChoiceIndex()]; 
    346  
    347     // -- Step 4: open file -- 
     119    status = options.promptOptions(); 
     120    if (!statusOk(status)) return; 
     121 
     122    String stackFormat = options.getStackFormat(); 
     123    boolean mergeChannels = options.isMergeChannels(); 
     124    boolean colorize = options.isColorize(); 
     125    boolean splitWindows = options.isSplitWindows(); 
     126    boolean showMetadata = options.isShowMetadata(); 
     127    boolean groupFiles = options.isGroupFiles(); 
     128    boolean concatenate = options.isConcatenate(); 
     129    boolean specifyRanges = options.isSpecifyRanges(); 
     130 
     131    boolean viewNone = options.isViewNone(); 
     132    boolean viewStandard = options.isViewStandard(); 
     133    boolean viewImage5D = options.isViewImage5D(); 
     134    boolean viewBrowser = options.isViewBrowser(); 
     135    boolean viewView5D = options.isViewView5D(); 
     136 
     137    // -- Step 4: read file -- 
    348138 
    349139    IJ.showStatus("Analyzing " + id); 
     
    352142      // -- Step 4a: do some preparatory work -- 
    353143 
    354       if (stackFormat.equals(VIEW_IMAGE_5D)) mergeChannels = false; 
     144      if (viewImage5D) mergeChannels = false; 
    355145 
    356146      FileStitcher fs = null; 
     
    365155        // prompt user to confirm file pattern (or grab from macro options) 
    366156        id = FilePattern.findPattern(idLoc); 
    367         gd = new GenericDialog("Bio-Formats File Stitching"); 
     157        GenericDialog gd = new GenericDialog("Bio-Formats File Stitching"); 
    368158        int len = id.length() + 1; 
    369159        if (len > 80) len = 80; 
     
    457247      } 
    458248 
    459       // -- Step 4a: prompt for the series to open, if necessary -- 
     249      // -- Step 3a: prompt for the series to open, if necessary -- 
    460250 
    461251      if (seriesCount > 1) { 
    462         gd = new GenericDialog("Bio-Formats Series Options"); 
     252        GenericDialog gd = new GenericDialog("Bio-Formats Series Options"); 
    463253 
    464254        GridBagLayout gdl = (GridBagLayout) gd.getLayout(); 
     
    479269          gd.add(p[i]); 
    480270        } 
    481         addScrollBars(gd); 
     271        Util.addScrollBars(gd); 
    482272        ThumbLoader loader = new ThumbLoader(r, p, gd); 
    483273        gd.showDialog(); 
     
    528318        if (needRange) { 
    529319          IJ.showStatus(""); 
    530           gd = new GenericDialog("Bio-Formats Range Options"); 
     320          GenericDialog gd = new GenericDialog("Bio-Formats Range Options"); 
    531321          for (int i=0; i<seriesCount; i++) { 
    532322            if (!series[i]) continue; 
     
    556346            } 
    557347          } 
    558           addScrollBars(gd); 
     348          Util.addScrollBars(gd); 
    559349          gd.showDialog(); 
    560350          if (gd.wasCanceled()) { 
     
    640430          } 
    641431          else s = ""; 
    642           meta.put(s + "SizeX", new Integer(r.getSizeX())); 
    643           meta.put(s + "SizeY", new Integer(r.getSizeY())); 
    644           meta.put(s + "SizeZ", new Integer(r.getSizeZ())); 
    645           meta.put(s + "SizeT", new Integer(r.getSizeT())); 
    646           meta.put(s + "SizeC", new Integer(r.getSizeC())); 
    647           meta.put(s + "IsRGB", new Boolean(r.isRGB())); 
    648           meta.put(s + "PixelType", 
     432          final String pad = " "; 
     433          meta.put(pad + s + "SizeX", new Integer(r.getSizeX())); 
     434          meta.put(pad + s + "SizeY", new Integer(r.getSizeY())); 
     435          meta.put(pad + s + "SizeZ", new Integer(r.getSizeZ())); 
     436          meta.put(pad + s + "SizeT", new Integer(r.getSizeT())); 
     437          meta.put(pad + s + "SizeC", new Integer(r.getSizeC())); 
     438          meta.put(pad + s + "IsRGB", new Boolean(r.isRGB())); 
     439          meta.put(pad + s + "PixelType", 
    649440            FormatTools.getPixelTypeString(r.getPixelType())); 
    650           meta.put(s + "LittleEndian", new Boolean(r.isLittleEndian())); 
    651           meta.put(s + "DimensionOrder", r.getDimensionOrder()); 
    652           meta.put(s + "IsInterleaved", new Boolean(r.isInterleaved())); 
    653         } 
    654  
    655         Enumeration keys = meta.keys(); 
     441          meta.put(pad + s + "LittleEndian", new Boolean(r.isLittleEndian())); 
     442          meta.put(pad + s + "DimensionOrder", r.getDimensionOrder()); 
     443          meta.put(pad + s + "IsInterleaved", new Boolean(r.isInterleaved())); 
     444        } 
     445 
     446        // sort metadata keys 
     447        Enumeration e = meta.keys(); 
     448        Vector v = new Vector(); 
     449        while (e.hasMoreElements()) v.add(e.nextElement()); 
     450        String[] keys = new String[v.size()]; 
     451        v.copyInto(keys); 
     452        Arrays.sort(keys); 
     453 
    656454        StringBuffer sb = new StringBuffer(); 
    657  
    658         while (keys.hasMoreElements()) { 
    659           Object key = keys.nextElement(); 
    660           sb.append(key); 
    661           sb.append("\t \t"); 
    662           sb.append(meta.get(key)); 
     455        for (int i=0; i<keys.length; i++) { 
     456          sb.append(keys[i]); 
     457          sb.append("\t"); 
     458          sb.append(meta.get(keys[i])); 
    663459          sb.append("\n"); 
    664460        } 
    665461 
    666462        TextWindow tw = new TextWindow("Metadata - " + currentFile, 
    667           "Key\t \tValue", sb.toString(), 400, 400); 
     463          "Key\tValue", sb.toString(), 400, 400); 
    668464        tw.setVisible(true); 
    669465        WindowManager.addWindow(tw); 
     
    673469 
    674470      // only read data explicitly if not using 4D Data Browser 
    675       if (!stackFormat.equals(VIEW_BROWSER)) { 
     471      if (!viewBrowser) { 
    676472        IJ.showStatus("Reading " + currentFile); 
    677473 
     
    681477 
    682478          boolean[] load = new boolean[num[i]]; 
    683           if (!stackFormat.equals(VIEW_NONE)) { 
     479          if (!viewNone) { 
    684480            if (certain[i]) { 
    685481              for (int c=cBegin[i]; c<=cEnd[i]; c+=cStep[i]) { 
     
    705501          long startTime = System.currentTimeMillis(); 
    706502          long time = startTime; 
    707           ImageStack stackB = null, stackS = null, stackF = null, stackO = null; 
     503 
     504          ImageStack stackB = null; // for byte images (8-bit) 
     505          ImageStack stackS = null; // for short images (16-bit) 
     506          ImageStack stackF = null; // for floating point images (32-bit) 
     507          ImageStack stackO = null; // for all other images (24-bit RGB) 
    708508 
    709509          int w = r.getSizeX(); 
     
    770570            String label = sb.toString(); 
    771571 
    772             // read bytes for jth plane 
    773             boolean first = true; 
    774             byte[] b = null; 
    775             while (true) { 
    776               // read LuraWave license code, if available 
    777               String code = Prefs.get("lurawave.license", null); 
    778               if (code != null) System.setProperty("lurawave.license", code); 
    779               try { 
    780                 b = r.openBytes(j); 
    781                 break; 
    782               } 
    783               catch (FormatException exc) { 
    784                 String msg = exc.getMessage(); 
    785                 if (msg != null && (msg.equals(LuraWaveCodec.NO_LICENSE_MSG) || 
    786                   msg.startsWith(LuraWaveCodec.INVALID_LICENSE_MSG))) 
    787                 { 
    788                   // prompt user for LuraWave license code 
    789                   gd = new GenericDialog("LuraWave License Code"); 
    790                   if (first) first = false; 
    791                   else gd.addMessage("Invalid license code; try again."); 
    792                   gd.addStringField("LuraWave_License Code: ", code, 16); 
    793                   gd.showDialog(); 
    794                   if (gd.wasCanceled()) { 
    795                     plugin.canceled = true; 
    796                     return; 
    797                   } 
    798                   code = gd.getNextString(); 
    799                   if (code != null) Prefs.set("lurawave.license", code); 
    800                 } 
    801                 else throw exc; 
    802               } 
    803             } 
    804  
    805             // construct image processor and add to stack 
    806             ImageProcessor ip = null; 
    807  
    808             int bpp = FormatTools.getBytesPerPixel(type); 
    809  
    810             if (b.length != w * h * c * bpp && b.length != w * h * bpp) { 
    811               // HACK - byte array dimensions are incorrect - image is probably 
    812               // a different size, but we have no way of knowing what size; 
    813               // so open this plane as a BufferedImage instead 
    814               BufferedImage bi = r.openImage(j); 
    815               b = ImageTools.padImage(b, r.isInterleaved(), c, 
    816                 bi.getWidth() * bpp, w, h); 
    817             } 
    818  
    819             Object pixels = DataTools.makeDataArray(b, bpp, 
    820               type == FormatTools.FLOAT || type == FormatTools.DOUBLE, 
    821               r.isLittleEndian()); 
    822  
    823             if (pixels instanceof byte[]) { 
    824               byte[] bytes = (byte[]) pixels; 
    825               if (bytes.length > w*h) { 
    826                 byte[] tmp = bytes; 
    827                 bytes = new byte[w*h]; 
    828                 System.arraycopy(tmp, 0, bytes, 0, bytes.length); 
    829               } 
    830  
    831               ip = new ByteProcessor(w, h, bytes, null); 
     572            // get image processor for jth plane 
     573            ImageProcessor ip = Util.openProcessor(r, j); 
     574            if (ip == null) { 
     575              plugin.canceled = true; 
     576              return; 
     577            } 
     578 
     579            // add plane to image stack 
     580            if (ip instanceof ByteProcessor) { 
    832581              if (stackB == null) stackB = new ImageStack(w, h); 
    833582              stackB.addSlice(label, ip); 
    834583            } 
    835             else if (pixels instanceof short[]) { 
    836               short[] s = (short[]) pixels; 
    837               if (s.length > w*h) { 
    838                 short[] tmp = s; 
    839                 s = new short[w*h]; 
    840                 System.arraycopy(tmp, 0, s, 0, s.length); 
    841               } 
    842  
    843               ip = new ShortProcessor(w, h, s, null); 
     584            else if (ip instanceof ShortProcessor) { 
    844585              if (stackS == null) stackS = new ImageStack(w, h); 
    845586              stackS.addSlice(label, ip); 
    846587            } 
    847             else if (pixels instanceof int[]) { 
    848               int[] s = (int[]) pixels; 
    849               if (s.length > w*h) { 
    850                 int[] tmp = s; 
    851                 s = new int[w*h]; 
    852                 System.arraycopy(tmp, 0, s, 0, s.length); 
    853               } 
    854  
    855               ip = new FloatProcessor(w, h, s); 
    856               if (stackF == null) stackF = new ImageStack(w, h); 
    857               stackF.addSlice(label, ip); 
    858             } 
    859             else if (pixels instanceof float[]) { 
    860               float[] f = (float[]) pixels; 
    861               if (f.length > w*h) { 
    862                 float[] tmp = f; 
    863                 f = new float[w*h]; 
    864                 System.arraycopy(tmp, 0, f, 0, f.length); 
    865               } 
    866  
    867               if (c == 1) { 
    868                 ip = new FloatProcessor(w, h, f, null); 
     588            else if (ip instanceof FloatProcessor) { 
     589              // merge image plane into existing stack if possible 
     590              if (stackB != null) { 
     591                ip = ip.convertToByte(true); 
     592                stackB.addSlice(label, ip); 
     593              } 
     594              else if (stackS != null) { 
     595                ip = ip.convertToShort(true); 
     596                stackS.addSlice(label, ip); 
     597              } 
     598              else { 
    869599                if (stackF == null) stackF = new ImageStack(w, h); 
    870  
    871                 if (stackB != null) { 
    872                   ip = ip.convertToByte(true); 
    873                   stackB.addSlice(label, ip); 
    874                   stackF = null; 
    875                 } 
    876                 else if (stackS != null) { 
    877                   ip = ip.convertToShort(true); 
    878                   stackS.addSlice(label, ip); 
    879                   stackF = null; 
    880                 } 
    881                 else stackF.addSlice(label, ip); 
    882               } 
    883               else { 
    884                 if (stackO == null) stackO = new ImageStack(w, h); 
    885                 float[][] pix = new float[c][w*h]; 
    886                 if (!r.isInterleaved()) { 
    887                   for (int k=0; k<f.length; k+=c) { 
    888                     for (int l=0; l<c; l++) { 
    889                       pix[l][k / c] = f[k + l]; 
    890                     } 
    891                   } 
    892                 } 
    893                 else { 
    894                   for (int k=0; k<c; k++) { 
    895                     System.arraycopy(f, k*pix[k].length, pix[k], 0, 
    896                       pix[k].length); 
    897                   } 
    898                 } 
    899                 byte[][] bytes = new byte[c][w*h]; 
    900                 for (int k=0; k<c; k++) { 
    901                   ip = new FloatProcessor(w, h, pix[k], null); 
    902                   ip = ip.convertToByte(true); 
    903                   bytes[k] = (byte[]) ip.getPixels(); 
    904                 } 
    905                 ip = new ColorProcessor(w, h); 
    906                 ((ColorProcessor) ip).setRGB(bytes[0], bytes[1], 
    907                   pix.length >= 3 ? bytes[2] : new byte[w*h]); 
    908                 stackO.addSlice(label, ip); 
    909               } 
    910             } 
    911             else if (pixels instanceof double[]) { 
    912               double[] d = (double[]) pixels; 
    913               if (d.length > w*h) { 
    914                 double[] tmp = d; 
    915                 d = new double[w*h]; 
    916                 System.arraycopy(tmp, 0, d, 0, d.length); 
    917               } 
    918  
    919               ip = new FloatProcessor(w, h, d); 
    920               if (stackF == null) stackF = new ImageStack(w, h); 
    921               stackF.addSlice(label, ip); 
     600                stackF.addSlice(label, ip); 
     601              } 
     602            } 
     603            else if (ip instanceof ColorProcessor) { 
     604              if (stackO == null) stackO = new ImageStack(w, h); 
     605              stackO.addSlice(label, ip); 
    922606            } 
    923607          } 
     
    925609          IJ.showStatus("Creating image"); 
    926610          IJ.showProgress(1); 
    927           ImagePlus imp = null; 
    928           if (stackB != null) { 
    929             if (!mergeChannels && splitWindows) { 
    930               slice(stackB, sizeZ[i], sizeC[i], sizeT[i], fi, r, fs, 
    931                 specifyRanges, colorize, mergeChannels, concatenate, 
    932                 stackFormat, quiet); 
    933             } 
    934             else imp = new ImagePlus(currentFile, stackB); 
    935           } 
    936           if (stackS != null) { 
    937             if (!mergeChannels && splitWindows) { 
    938               slice(stackS, sizeZ[i], sizeC[i], sizeT[i], fi, r, fs, 
    939                 specifyRanges, colorize, mergeChannels, concatenate, 
    940                 stackFormat, quiet); 
    941             } 
    942             else imp = new ImagePlus(currentFile, stackS); 
    943           } 
    944           if (stackF != null) { 
    945             if (!mergeChannels && splitWindows) { 
    946               slice(stackF, sizeZ[i], sizeC[i], sizeT[i], fi, r, fs, 
    947                 specifyRanges, colorize, mergeChannels, concatenate, 
    948                 stackFormat, quiet); 
    949             } 
    950             else imp = new ImagePlus(currentFile, stackF); 
    951           } 
    952           if (stackO != null) { 
    953             if (!mergeChannels && splitWindows) { 
    954               slice(stackO, sizeZ[i], sizeC[i], sizeT[i], fi, r, fs, 
    955                 specifyRanges, colorize, mergeChannels, concatenate, 
    956                 stackFormat, quiet); 
    957             } 
    958             else imp = new ImagePlus(currentFile, stackO); 
    959           } 
    960  
    961           if (imp != null) { 
    962             // retrieve the spatial calibration information, if available 
    963             applyCalibration(store, imp, i); 
    964             imp.setFileInfo(fi); 
    965             imp.setDimensions(cCount[i], zCount[i], tCount[i]); 
    966             displayStack(imp, r, fs, mergeChannels, 
    967               concatenate, stackFormat, quiet); 
    968           } 
     611 
     612          showStack(stackB, currentFile, store, cCount[i], zCount[i], 
     613            tCount[i], sizeZ[i], sizeC[i], sizeT[i], fi, r, fs, options); 
     614          showStack(stackS, currentFile, store, cCount[i], zCount[i], 
     615            tCount[i], sizeZ[i], sizeC[i], sizeT[i], fi, r, fs, options); 
     616          showStack(stackF, currentFile, store, cCount[i], zCount[i], 
     617            tCount[i], sizeZ[i], sizeC[i], sizeT[i], fi, r, fs, options); 
     618          showStack(stackO, currentFile, store, cCount[i], zCount[i], 
     619            tCount[i], sizeZ[i], sizeC[i], sizeT[i], fi, r, fs, options); 
    969620 
    970621          long endTime = System.currentTimeMillis(); 
     
    979630          } 
    980631        } 
     632        r.close(); 
    981633 
    982634        if (concatenate) { 
     
    1023675          } 
    1024676        } 
    1025  
    1026         r.close(); 
    1027       } 
     677      } 
     678 
     679      // -- Step 5: finish up -- 
    1028680 
    1029681      plugin.success = true; 
    1030682 
    1031       // save parameter values to IJ_Prefs.txt 
    1032       Prefs.set("bioformats.mergeChannels", mergeChannels); 
    1033       Prefs.set("bioformats.colorize", colorize); 
    1034       Prefs.set("bioformats.splitWindows", splitWindows); 
    1035       Prefs.set("bioformats.showMetadata", showMetadata); 
    1036       Prefs.set("bioformats.groupFiles", groupFiles); 
    1037       Prefs.set("bioformats.concatenate", concatenate); 
    1038       Prefs.set("bioformats.specifyRanges", specifyRanges); 
    1039       Prefs.set("bioformats.stackFormat", stackFormat); 
    1040  
    1041       if (stackFormat.equals(VIEW_BROWSER)) { 
     683      options.savePreferences(); 
     684 
     685      if (viewBrowser) { 
    1042686        boolean first = true; 
    1043687        for (int i=0; i<seriesCount; i++) { 
     
    1051695    } 
    1052696    catch (Exception exc) { 
    1053       exc.printStackTrace(); 
    1054       IJ.showStatus(""); 
    1055       if (!quiet) { 
    1056         StringBuffer sb = new StringBuffer(); 
    1057         sb.append(exc.toString()); 
    1058         StackTraceElement[] ste = exc.getStackTrace(); 
    1059         for (int i=0; i<ste.length; i++) { 
    1060           sb.append("\n"); 
    1061           sb.append(ste[i].toString()); 
    1062         } 
    1063         String msg = sb.toString(); 
    1064         IJ.error("Bio-Formats", "Sorry, there was a problem " + 
    1065           "reading the data" + (msg == null ? "." : (":\n" + msg))); 
    1066       } 
     697      reportException(exc, quiet, 
     698        "Sorry, there was a problem reading the data"); 
    1067699    } 
    1068700  } 
    1069701 
    1070   // -- ItemListener API methods -- 
    1071  
    1072   /** Handles toggling of mutually exclusive options. */ 
    1073   public void itemStateChanged(ItemEvent e) { 
    1074     Object src = e.getSource(); 
    1075     if (src == mergeBox) { 
    1076       if (mergeBox.getState()) { 
    1077         colorizeBox.setState(false); 
    1078         splitBox.setState(false); 
    1079       } 
    1080     } 
    1081     else if (src == colorizeBox) { 
    1082       if (colorizeBox.getState()) { 
    1083         mergeBox.setState(false); 
    1084         splitBox.setState(true); 
    1085         // NB: temporary 
    1086         String s = stackChoice.getSelectedItem(); 
    1087         if (s.equals(VIEW_BROWSER)) stackChoice.select(VIEW_STANDARD); 
    1088       } 
    1089     } 
    1090     else if (src == splitBox) { 
    1091       if (splitBox.getState()) { 
    1092         mergeBox.setState(false); 
    1093         String s = stackChoice.getSelectedItem(); 
    1094         if (s.equals(VIEW_BROWSER)) stackChoice.select(VIEW_STANDARD); 
    1095       } 
    1096     } 
    1097     else if (src == metadataBox) { 
    1098       if (!metadataBox.getState()) { 
    1099         String s = stackChoice.getSelectedItem(); 
    1100         if (s.equals(VIEW_NONE)) stackChoice.select(VIEW_STANDARD); 
    1101       } 
    1102     } 
    1103     else if (src == groupBox) { 
    1104     } 
    1105     else if (src == concatenateBox) { 
    1106     } 
    1107     else if (src == rangeBox) { 
    1108       if (rangeBox.getState()) { 
    1109         String s = stackChoice.getSelectedItem(); 
    1110         if (s.equals(VIEW_NONE) || s.equals(VIEW_BROWSER)) { 
    1111           stackChoice.select(VIEW_STANDARD); 
    1112         } 
    1113       } 
    1114     } 
    1115     else if (src == stackChoice) { 
    1116       String s = stackChoice.getSelectedItem(); 
    1117       if (s.equals(VIEW_NONE)) { 
    1118         metadataBox.setState(true); 
    1119         rangeBox.setState(false); 
    1120       } 
    1121       if (s.equals(VIEW_STANDARD)) { 
    1122       } 
    1123       else if (s.equals(VIEW_BROWSER)) { 
    1124         colorizeBox.setState(false); // NB: temporary 
    1125         splitBox.setState(false); 
    1126         rangeBox.setState(false); 
    1127       } 
    1128       else if (s.equals(VIEW_IMAGE_5D)) { 
    1129       } 
    1130       else if (s.equals(VIEW_VIEW_5D)) { 
    1131       } 
     702  // -- Helper methods -- 
     703 
     704  private void showStack(ImageStack stack, String label, 
     705    OMEXMLMetadataStore store, int cCount, int zCount, int tCount, 
     706    int sizeZ, int sizeC, int sizeT, FileInfo fi, IFormatReader r, 
     707    FileStitcher fs, ImporterOptions options) 
     708    throws FormatException, IOException 
     709  { 
     710    if (stack == null) return; 
     711    if (!options.isMergeChannels() && options.isSplitWindows()) { 
     712      slice(stack, sizeZ, sizeC, sizeT, fi, r, fs, options); 
     713    } 
     714    else { 
     715      ImagePlus imp = new ImagePlus(label, stack); 
     716 
     717      // retrieve the spatial calibration information, if available 
     718      applyCalibration(store, imp, r.getSeries()); 
     719      imp.setFileInfo(fi); 
     720      imp.setDimensions(cCount, zCount, tCount); 
     721      displayStack(imp, r, fs, options); 
    1132722    } 
    1133723  } 
    1134  
    1135   // -- Helper methods -- 
    1136724 
    1137725  /** Opens each channel of the source stack in a separate window. */ 
    1138726  private void slice(ImageStack is, int z, int c, int t, FileInfo fi, 
    1139     IFormatReader r, FileStitcher fs, boolean range, boolean colorize, 
    1140     boolean mergeChannels, boolean concatenate, String stackFormat, 
    1141     boolean quiet) throws FormatException, IOException 
     727    IFormatReader r, FileStitcher fs, ImporterOptions options) 
     728    throws FormatException, IOException 
    1142729  { 
     730    boolean range = options.isSpecifyRanges(); 
     731 
    1143732    int step = 1; 
    1144733    if (range) { 
     
    1181770      // colorize channels; mostly copied from the ImageJ source 
    1182771 
    1183       if (colorize) { 
     772      if (options.isColorize()) { 
    1184773        fi.reds = new byte[256]; 
    1185774        fi.greens = new byte[256]; 
     
    1204793      imp.setFileInfo(fi); 
    1205794      imp.setDimensions(1, r.getSizeZ(), r.getSizeT()); 
    1206       displayStack(imp, r, fs, mergeChannels, concatenate, stackFormat, quiet); 
    1207     } 
    1208   } 
    1209  
    1210   /** Applies spatial calibrations to an image stack. */ 
    1211   private void applyCalibration(OMEXMLMetadataStore store, ImagePlus imp, 
    1212     int series) 
    1213   { 
    1214     double xcal = Double.NaN, ycal = Double.NaN, zcal = Double.NaN; 
    1215     Integer ii = new Integer(series); 
    1216  
    1217     Float xf = store.getPixelSizeX(ii); 
    1218     if (xf != null) xcal = xf.floatValue(); 
    1219     Float yf = store.getPixelSizeY(ii); 
    1220     if (yf != null) ycal = yf.floatValue(); 
    1221     Float zf = store.getPixelSizeZ(ii); 
    1222     if (zf != null) zcal = zf.floatValue(); 
    1223  
    1224     if (xcal == xcal || ycal == ycal || zcal == zcal) { 
    1225       Calibration cal = new Calibration(); 
    1226       cal.setUnit("micron"); 
    1227       cal.pixelWidth = xcal; 
    1228       cal.pixelHeight = ycal; 
    1229       cal.pixelDepth = zcal; 
    1230       imp.setCalibration(cal); 
    1231     } 
    1232   } 
    1233  
    1234   private void makeRGB(ImagePlus imp, IFormatReader r, int c) 
    1235     throws FormatException, IOException 
    1236   { 
    1237     ImageStack s = imp.getStack(); 
    1238     ImageStack newStack = new ImageStack(s.getWidth(), s.getHeight()); 
    1239     for (int i=0; i<s.getSize(); i++) { 
    1240       ImageProcessor p = s.getProcessor(i + 1).convertToByte(true); 
    1241       newStack.addSlice(s.getSliceLabel(i + 1), p); 
    1242     } 
    1243     imp.setStack(imp.getTitle(), newStack); 
    1244     adjustDisplay(imp); 
    1245  
    1246     s = imp.getStack(); 
    1247     newStack = new ImageStack(s.getWidth(), s.getHeight()); 
    1248  
    1249     int sizeZ = r.getSizeZ(); 
    1250     int sizeT = r.getSizeT(); 
    1251  
    1252     for (int z=0; z<sizeZ; z++) { 
    1253       for (int t=0; t<sizeT; t++) { 
    1254         byte[][] bytes = new byte[c][]; 
    1255         for (int ch=0; ch<r.getSizeC()/c; ch++) { 
    1256           for (int ch1=0; ch1<c; ch1++) { 
    1257             int ndx = r.getIndex(z, ch*c + ch1, t) + 1; 
    1258             bytes[ch1] = (byte[]) s.getProcessor(ndx).getPixels(); 
    1259           } 
    1260           ColorProcessor cp = new ColorProcessor(s.getWidth(), s.getHeight()); 
    1261           cp.setRGB(bytes[0], bytes[1], bytes.length == 3 ? bytes[2] : 
    1262             new byte[s.getWidth() * s.getHeight()]); 
    1263           int ndx = r.getIndex(z, ch*c, t) + 1; 
    1264           newStack.addSlice(s.getSliceLabel(ndx), cp); 
    1265         } 
    1266       } 
    1267     } 
    1268     imp.setStack(imp.getTitle(), newStack); 
     795      displayStack(imp, r, fs, options); 
     796    } 
    1269797  } 
    1270798 
    1271799  /** Displays the image stack using the appropriate plugin. */ 
    1272800  private void displayStack(ImagePlus imp, IFormatReader r, FileStitcher fs, 
    1273     boolean mergeChannels, boolean concatenate, String stackFormat, 
    1274     boolean quiet) 
     801    ImporterOptions options) 
    1275802  { 
    1276     adjustDisplay(imp); 
     803    boolean mergeChannels = options.isMergeChannels(); 
     804    boolean concatenate = options.isConcatenate(); 
     805 
     806    Util.adjustColorRange(imp); 
    1277807 
    1278808    try { 
    1279809      // convert to RGB if needed 
    1280  
    1281810      int pixelType = r.getPixelType(); 
    1282811      if (mergeChannels && r.getSizeC() > 1 && r.getSizeC() < 4 && 
     
    1305834          } 
    1306835          catch (ReflectException exc) { 
    1307             exc.printStackTrace(); 
    1308             if (!quiet) { 
    1309               String msg = exc.getMessage(); 
    1310               IJ.error("Bio-Formats", "Sorry, there was a problem " + 
    1311                 "constructing the composite image"); 
    1312             } 
     836            reportException(exc, options.isQuiet(), 
     837              "Sorry, there was a problem constructing the composite image"); 
    1313838            return; 
    1314839          } 
     
    1347872        imp.getStackSize() / (imp.getNSlices() * imp.getNFrames()), 
    1348873        imp.getNSlices(), imp.getNFrames()); 
    1349       if (stackFormat.equals(VIEW_STANDARD)) { 
    1350         if (!concatenate) imp.show(); 
    1351         else imps.add(imp); 
    1352       } 
    1353       else if (stackFormat.equals(VIEW_BROWSER)) {} 
    1354       else if (stackFormat.equals(VIEW_IMAGE_5D)) { 
     874      if (options.isViewBrowser()) { } 
     875      else if (options.isViewImage5D()) { 
    1355876        int sizeZ = r.getSizeZ(); 
    1356877        int sizeT = r.getSizeT(); 
     
    1390911        ru.exec("i5d.show()"); 
    1391912      } 
    1392       else if (stackFormat.equals(VIEW_VIEW_5D)) { 
     913      else if (options.isViewView5D()) { 
    1393914        int sizeZ = r.getSizeZ(); 
    1394915        int sizeC = r.getSizeC(); 
     
    1415936        IJ.run("View5D ", ""); 
    1416937      } 
     938      else if (!options.isViewNone()) { 
     939        if (!concatenate) imp.show(); 
     940        else imps.add(imp); 
     941      } 
    1417942    } 
    1418943    catch (Exception exc) { 
     
    1423948  } 
    1424949 
    1425   private void adjustDisplay(ImagePlus imp) { 
     950  /** Applies spatial calibrations to an image stack. */ 
     951  private void applyCalibration(OMEXMLMetadataStore store, 
     952    ImagePlus imp, int series) 
     953  { 
     954    double xcal = Double.NaN, ycal = Double.NaN, zcal = Double.NaN; 
     955    Integer ii = new Integer(series); 
     956 
     957    Float xf = store.getPixelSizeX(ii); 
     958    if (xf != null) xcal = xf.floatValue(); 
     959    Float yf = store.getPixelSizeY(ii); 
     960    if (yf != null) ycal = yf.floatValue(); 
     961    Float zf = store.getPixelSizeZ(ii); 
     962    if (zf != null) zcal = zf.floatValue(); 
     963 
     964    if (xcal == xcal || ycal == ycal || zcal == zcal) { 
     965      Calibration cal = new Calibration(); 
     966      cal.setUnit("micron"); 
     967      cal.pixelWidth = xcal; 
     968      cal.pixelHeight = ycal; 
     969      cal.pixelDepth = zcal; 
     970      imp.setCalibration(cal); 
     971    } 
     972  } 
     973 
     974  private void makeRGB(ImagePlus imp, IFormatReader r, int c) 
     975    throws FormatException, IOException 
     976  { 
    1426977    ImageStack s = imp.getStack(); 
    1427     double min = Double.MAX_VALUE; 
    1428     double max = Double.MIN_VALUE; 
     978    ImageStack newStack = new ImageStack(s.getWidth(), s.getHeight()); 
    1429979    for (int i=0; i<s.getSize(); i++) { 
    1430       ImageProcessor p = s.getProcessor(i + 1); 
    1431       p.resetMinAndMax(); 
    1432       if (p.getMin() < min) min = p.getMin(); 
    1433       if (p.getMax() > max) max = p.getMax(); 
    1434     } 
    1435  
    1436     ImageProcessor p = imp.getProcessor(); 
    1437     if (p instanceof ColorProcessor) { 
    1438       ((ColorProcessor) p).setMinAndMax(min, max, 3); 
    1439     } 
    1440     else p.setMinAndMax(min, max); 
    1441     imp.setProcessor(imp.getTitle(), p); 
    1442   } 
    1443  
    1444   private void addScrollBars(Container pane) { 
    1445     GridBagLayout layout = (GridBagLayout) pane.getLayout(); 
    1446  
    1447     // extract components 
    1448     int count = pane.getComponentCount(); 
    1449     Component[] c = new Component[count]; 
    1450     GridBagConstraints[] gbc = new GridBagConstraints[count]; 
    1451     for (int i=0; i<count; i++) { 
    1452       c[i] = pane.getComponent(i); 
    1453       gbc[i] = layout.getConstraints(c[i]); 
    1454     } 
    1455  
    1456     // clear components 
    1457     pane.removeAll(); 
    1458     layout.invalidateLayout(pane); 
    1459  
    1460     // create new container panel 
    1461     Panel newPane = new Panel(); 
    1462     GridBagLayout newLayout = new GridBagLayout(); 
    1463     newPane.setLayout(newLayout); 
    1464     for (int i=0; i<count; i++) { 
    1465       newLayout.setConstraints(c[i], gbc[i]); 
    1466       newPane.add(c[i]); 
    1467     } 
    1468  
    1469     // get preferred size for container panel 
    1470     // NB: don't know a better way: 
    1471     // - newPane.getPreferredSize() doesn't work 
    1472     // - newLayout.preferredLayoutSize(newPane) doesn't work 
    1473     Frame f = new Frame(); 
    1474     f.setLayout(new BorderLayout()); 
    1475     f.add(newPane, BorderLayout.CENTER); 
    1476     f.pack(); 
    1477     final Dimension size = newPane.getSize(); 
    1478     f.remove(newPane); 
    1479     f.dispose(); 
    1480  
    1481     // compute best size for scrollable viewport 
    1482     size.width += 15; 
    1483     size.height += 15; 
    1484     Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); 
    1485     int maxWidth = 3 * screen.width / 4; 
    1486     int maxHeight = 3 * screen.height / 4; 
    1487     if (size.width > maxWidth) size.width = maxWidth; 
    1488     if (size.height > maxHeight) size.height = maxHeight; 
    1489  
    1490     // create scroll pane 
    1491     ScrollPane scroll = new ScrollPane() { 
    1492       public Dimension getPreferredSize() { 
    1493         return size; 
    1494       } 
    1495     }; 
    1496     scroll.add(newPane); 
    1497  
    1498     // add scroll pane to original container 
    1499     GridBagConstraints constraints = new GridBagConstraints(); 
    1500     constraints.fill = GridBagConstraints.BOTH; 
    1501     constraints.weightx = 1.0; 
    1502     constraints.weighty = 1.0; 
    1503     layout.setConstraints(scroll, constraints); 
    1504     pane.add(scroll); 
     980      ImageProcessor p = s.getProcessor(i + 1).convertToByte(true); 
     981      newStack.addSlice(s.getSliceLabel(i + 1), p); 
     982    } 
     983    imp.setStack(imp.getTitle(), newStack); 
     984    Util.adjustColorRange(imp); 
     985 
     986    s = imp.getStack(); 
     987    newStack = new ImageStack(s.getWidth(), s.getHeight()); 
     988 
     989    int sizeZ = r.getSizeZ(); 
     990    int sizeT = r.getSizeT(); 
     991 
     992    for (int z=0; z<sizeZ; z++) { 
     993      for (int t=0; t<sizeT; t++) { 
     994        byte[][] bytes = new byte[c][]; 
     995        for (int ch=0; ch<r.getSizeC()/c; ch++) { 
     996          for (int ch1=0; ch1<c; ch1++) { 
     997            int ndx = r.getIndex(z, ch*c + ch1, t) + 1; 
     998            bytes[ch1] = (byte[]) s.getProcessor(ndx).getPixels(); 
     999          } 
     1000          ColorProcessor cp = new ColorProcessor(s.getWidth(), s.getHeight()); 
     1001          cp.setRGB(bytes[0], bytes[1], bytes.length == 3 ? bytes[2] : 
     1002            new byte[s.getWidth() * s.getHeight()]); 
     1003          int ndx = r.getIndex(z, ch*c, t) + 1; 
     1004          newStack.addSlice(s.getSliceLabel(ndx), cp); 
     1005        } 
     1006      } 
     1007    } 
     1008    imp.setStack(imp.getTitle(), newStack); 
    15051009  } 
    15061010 
     
    15121016    } 
    15131017    return digits; 
     1018  } 
     1019 
     1020  private boolean statusOk(int status) { 
     1021    if (status == ImporterOptions.STATUS_CANCELED) plugin.canceled = true; 
     1022    return status == ImporterOptions.STATUS_OK; 
     1023  } 
     1024 
     1025  private void reportException(Throwable t, boolean quiet, String msg) { 
     1026    t.printStackTrace(); 
     1027    IJ.showStatus(""); 
     1028    if (!quiet) { 
     1029      ByteArrayOutputStream buf = new ByteArrayOutputStream(); 
     1030      t.printStackTrace(new PrintStream(buf)); 
     1031      IJ.error("Bio-Formats", msg + ":\n" + buf.toString()); 
     1032    } 
    15141033  } 
    15151034 
  • trunk/loci/plugins/LociExporter.java

    r2722 r2779  
    44 
    55/* 
    6 LOCI Plugins for ImageJ: a collection of ImageJ plugins including 
    7 the 4D Data Browser, OME Plugin and Bio-Formats Exporter. 
     6LOCI Plugins for ImageJ: a collection of ImageJ plugins including the 
     74D Data Browser, Bio-Formats Importer, Bio-Formats Exporter and OME plugins. 
    88Copyright (C) 2006-@year@ Melissa Linkert, Christopher Peterson, 
    99Curtis Rueden, Philip Huettl and Francis Wong. 
     
    3333/** 
    3434 * ImageJ plugin for writing files using the LOCI Bio-Formats package. 
    35  * Wraps core logic in loci.plugins.Exporter, to avoid direct references 
    36  * to classes in the external Bio-Formats library. 
     35 * Wraps core logic in {@link loci.plugins.Exporter}, to avoid direct 
     36 * references to classes in the external Bio-Formats library. 
    3737 * 
    3838 * @author Melissa Linkert linkert at wisc.edu 
     
    5858  /** Executes the plugin. */ 
    5959  public void run(ImageProcessor ip) { 
    60     if (!Util.checkVersion()) return; 
     60    if (!Checker.checkVersion()) return; 
    6161    HashSet missing = new HashSet(); 
    62     Util.checkLibrary(Util.BIO_FORMATS, missing); 
    63     Util.checkLibrary(Util.OME_JAVA_XML, missing); 
    64     if (!Util.checkMissing(missing)) return; 
     62    Checker.checkLibrary(Checker.BIO_FORMATS, missing); 
     63    Checker.checkLibrary(Checker.OME_JAVA_XML, missing); 
     64    if (!Checker.checkMissing(missing)) return; 
    6565    if (exporter != null) exporter.run(ip); 
    6666  } 
  • trunk/loci/plugins/LociImporter.java

    r2777 r2779  
    44 
    55/* 
    6 LOCI Plugins for ImageJ: a collection of ImageJ plugins including 
    7 the 4D Data Browser, OME Plugin and Bio-Formats Exporter. 
     6LOCI Plugins for ImageJ: a collection of ImageJ plugins including the 
     74D Data Browser, Bio-Formats Importer, Bio-Formats Exporter and OME plugins. 
    88Copyright (C) 2006-@year@ Melissa Linkert, Christopher Peterson, 
    99Curtis Rueden, Philip Huettl and Francis Wong. 
     
    3131/** 
    3232 * ImageJ plugin for reading files using the LOCI Bio-Formats package. 
    33  * Wraps core logic in loci.plugins.Importer, to avoid direct references 
    34  * to classes in the external Bio-Formats library. 
     33 * Wraps core logic in {@link loci.plugins.Importer}, to avoid direct 
     34 * references to classes in the external Bio-Formats library. 
    3535 * 
    3636 * @author Curtis Rueden ctrueden at wisc.edu 
     
    6363    if ("about".equals(arg)) About.about(); 
    6464    else { 
    65       if (!Util.checkVersion()) return; 
     65      if (!Checker.checkVersion()) return; 
    6666      HashSet missing = new HashSet(); 
    67       Util.checkLibrary(Util.BIO_FORMATS, missing); 
    68       Util.checkLibrary(Util.OME_JAVA_XML, missing); 
    69       if (!Util.checkMissing(missing)) return; 
     67      Checker.checkLibrary(Checker.BIO_FORMATS, missing); 
     68      Checker.checkLibrary(Checker.OME_JAVA_XML, missing); 
     69      if (!Checker.checkMissing(missing)) return; 
    7070      new Importer(this).run(arg); 
    7171    } 
  • trunk/loci/plugins/LociUploader.java

    r2740 r2779  
    44 
    55/* 
    6 LOCI Plugins for ImageJ: a collection of ImageJ plugins including 
    7 the 4D Data Browser, OME Plugin and Bio-Formats Exporter. 
     6LOCI Plugins for ImageJ: a collection of ImageJ plugins including the 
     74D Data Browser, Bio-Formats Importer, Bio-Formats Exporter and OME plugins. 
    88Copyright (C) 2006-@year@ Melissa Linkert, Christopher Peterson, 
    99Curtis Rueden, Philip Huettl and Francis Wong. 
     
    5555  public void run(String arg) { 
    5656    // check that we can safely execute the plugin 
    57     if (!Util.checkVersion()) return; 
     57    if (!Checker.checkVersion()) return; 
    5858    HashSet missing = new HashSet(); 
    59     Util.checkLibrary(Util.BIO_FORMATS, missing); 
    60     Util.checkLibrary(Util.OME_JAVA_XML, missing); 
    61     Util.checkLibrary(Util.OME_JAVA_DS, missing); 
    62     if (!Util.checkMissing(missing)) return; 
     59    Checker.checkLibrary(Checker.BIO_FORMATS, missing); 
     60    Checker.checkLibrary(Checker.OME_JAVA_XML, missing); 
     61    Checker.checkLibrary(Checker.OME_JAVA_DS, missing); 
     62    if (!Checker.checkMissing(missing)) return; 
    6363 
    6464    promptForLogin(); 
  • trunk/loci/plugins/OMEPlugin.java

    r2722 r2779  
    44 
    55/* 
    6 OME Plugin for ImageJ plugin for transferring images to and from an OME 
    7 database. Copyright (C) 2004-@year@ Philip Huettl and Melissa Linkert. 
     6LOCI Plugins for ImageJ: a collection of ImageJ plugins including the 
     74D Data Browser, Bio-Formats Importer, Bio-Formats Exporter and OME plugins. 
     8Copyright (C) 2006-@year@ Melissa Linkert, Christopher Peterson, 
     9Curtis Rueden, Philip Huettl and Francis Wong. 
    810 
    911This program is free software; you can redistribute it and/or modify 
     
    3133import java.util.*; 
    3234import loci.ome.util.OMEUtils; 
    33 import loci.plugins.Util; 
    3435import org.openmicroscopy.ds.*; 
    3536import org.openmicroscopy.ds.dto.Image; 
     
    8485  /** Executes the plugin. */ 
    8586  public void run(String arg) { 
    86     if (!Util.checkVersion()) return; 
     87    if (!Checker.checkVersion()) return; 
    8788    HashSet missing = new HashSet(); 
    88     Util.checkLibrary(Util.BIO_FORMATS, missing); 
    89     Util.checkLibrary(Util.OME_JAVA_XML, missing); 
    90     Util.checkLibrary(Util.OME_JAVA_DS, missing); 
    91     Util.checkLibrary(Util.FORMS, missing); 
    92     if (!Util.checkMissing(missing)) return; 
     89    Checker.checkLibrary(Checker.BIO_FORMATS, missing); 
     90    Checker.checkLibrary(Checker.OME_JAVA_XML, missing); 
     91    Checker.checkLibrary(Checker.OME_JAVA_DS, missing); 
     92    Checker.checkLibrary(Checker.FORMS, missing); 
     93    if (!Checker.checkMissing(missing)) return; 
    9394    runPlugin(); 
    9495  } 
  • trunk/loci/plugins/ThumbLoader.java

    r2669 r2779  
    44 
    55/* 
    6 LOCI Plugins for ImageJ: a collection of ImageJ plugins including 
    7 the 4D Data Browser, OME Plugin and Bio-Formats Exporter. 
     6LOCI Plugins for ImageJ: a collection of ImageJ plugins including the 
     74D Data Browser, Bio-Formats Importer, Bio-Formats Exporter and OME plugins. 
    88Copyright (C) 2006-@year@ Melissa Linkert, Christopher Peterson, 
    99Curtis Rueden, Philip Huettl and Francis Wong. 
Note: See TracChangeset for help on using the changeset viewer.