Changeset 2777


Ignore:
Timestamp:
05/11/07 10:34:43 (13 years ago)
Author:
curtis
Message:
  • Add LuraWave license code prompt as needed
  • Clean up harvesting of options
Location:
trunk/loci/plugins
Files:
3 edited

Legend:

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

    r2744 r2777  
    4141import javax.swing.Box; 
    4242import loci.formats.*; 
     43import loci.formats.codec.LuraWaveCodec; 
    4344import loci.formats.ome.OMEReader; 
    4445import loci.formats.ome.OMEXMLMetadataStore; 
     
    6263 
    6364  private static final String LOCATION_LOCAL = "Local machine"; 
     65  private static final String LOCATION_HTTP = "Internet"; 
    6466  private static final String LOCATION_OME = "OME server"; 
    65   private static final String LOCATION_HTTP = "Internet"; 
     67  private static final String[] LOCATIONS = { 
     68    LOCATION_LOCAL, LOCATION_HTTP, LOCATION_OME 
     69  }; 
    6670 
    6771  // -- Fields -- 
    6872 
     73  /** 
     74   * A handle to the plugin wrapper, for toggling 
     75   * the canceled and success flags. 
     76   */ 
    6977  private LociImporter plugin; 
    70   private String stackFormat = ""; 
     78 
    7179  private Checkbox mergeBox; 
    7280  private Checkbox colorizeBox; 
     
    7785  private Checkbox rangeBox; 
    7886  private Choice stackChoice; 
    79   private boolean mergeChannels; 
    80   private boolean concatenate; 
    8187 
    8288  private Vector imps = new Vector(); 
    83   private boolean quiet; 
    8489 
    8590  // -- Constructor -- 
     
    9196  // -- Importer API methods -- 
    9297 
     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 
    93105  /** Executes the plugin. */ 
    94106  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 
     121 
     122    // -- Step 1: parse core options -- 
     123 
     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 
    95134    String location = null; 
    96     if (arg != null && arg.startsWith("location=")) { 
    97       // parse location from argument 
    98       location = Macro.getValue(arg, "location", null); 
    99       if (arg.indexOf("open") == -1) arg = null; 
    100     } 
    101  
    102     quiet = arg != null && !arg.equals("") && arg.indexOf("open=") == -1; 
    103  
    104     // -- Step 1: get filename to open -- 
    105  
    106135    String id = null; 
    107  
    108     // try to get filename from argument 
    109     if (quiet) id = arg; 
     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) -- 
    110203 
    111204    if (id == null) { 
    112       // try to get filename from macro options 
    113       String options = Macro.getOptions(); 
    114       if (options != null) { 
    115         String open = Macro.getValue(options, "open", null); 
    116         if (open != null) id = open; 
    117       } 
    118       if (arg != null) { 
    119         id = Macro.getValue(arg, "open", null); 
    120         arg = null; 
    121       } 
    122     } 
    123  
    124     String fileName = id; 
    125  
    126     GenericDialog gd; 
    127     if (id == null || id.length() == 0) { 
    128       if (location == null) { 
    129         // open a dialog asking the user where their dataset is 
    130         gd = new GenericDialog("Bio-Formats Dataset Location"); 
    131         gd.addChoice("Location: ", 
    132           new String[] {LOCATION_LOCAL, LOCATION_OME, LOCATION_HTTP}, 
    133             LOCATION_LOCAL); 
    134         gd.showDialog(); 
    135         if (gd.wasCanceled()) { 
     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) { 
    136211          plugin.canceled = true; 
    137212          return; 
    138213        } 
    139         location = gd.getNextChoice(); 
    140       } 
    141  
    142       if (LOCATION_LOCAL.equals(location)) { 
    143         // if necessary, prompt the user for the filename 
    144         OpenDialog od = new OpenDialog("Open", id); 
    145         String directory = od.getDirectory(); 
    146         fileName = od.getFileName(); 
    147         if (fileName == null) { 
    148           plugin.canceled = true; 
    149           return; 
    150         } 
    151         id = directory + fileName; 
    152  
    153         // if no valid filename, give up 
    154         if (id == null || !new Location(id).exists()) { 
    155           if (!quiet) { 
    156             IJ.error("Bio-Formats", "The specified file " + 
    157               (id == null ? "" : ("(" + id + ") ")) + "does not exist."); 
    158           } 
    159           return; 
    160         } 
    161       } 
    162       else if (LOCATION_OME.equals(location) && id == null) { 
    163         IJ.runPlugIn("loci.plugins.OMEPlugin", ""); 
    164         return; 
    165       } 
    166       else if (LOCATION_HTTP.equals(location)) { 
    167         // prompt for URL 
     214        id = dir + name; 
     215      } 
     216      else if (isHTTP) { 
     217        // prompt user for the URL (or grab from macro options) 
    168218        gd = new GenericDialog("Bio-Formats URL"); 
    169219        gd.addStringField("URL: ", "http://", 30); 
     
    174224        } 
    175225        id = gd.getNextString(); 
    176         fileName = id; 
    177       } 
    178       else IJ.error("Bio-Formats", "Invalid location: " + location); 
    179     } 
    180  
    181     String idType = "ID"; 
    182     if (LOCATION_LOCAL.equals(location)) idType = "Filename"; 
    183     else if (LOCATION_OME.equals(location)) idType = "OME address"; 
    184     else if (LOCATION_HTTP.equals(location)) idType = "URL"; 
     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    } 
    185261 
    186262    // -- Step 2: identify file -- 
     
    188264    // determine whether we can handle this file 
    189265    IFormatReader r = null; 
    190     if (!LOCATION_OME.equals(location)) { 
    191       IJ.showStatus("Identifying " + fileName); 
     266    if (isLocal || isHTTP) { 
     267      IJ.showStatus("Identifying " + idName); 
    192268      ImageReader reader = new ImageReader(); 
    193269      try { r = reader.getReader(id); } 
     
    222298    stackTypes.copyInto(stackFormats); 
    223299 
    224     // load preferences from IJ_Prefs.txt 
    225     mergeChannels = Prefs.get("bioformats.mergeChannels", false); 
    226     boolean colorize = Prefs.get("bioformats.colorize", false); 
    227     boolean splitWindows = Prefs.get("bioformats.splitWindows", true); 
    228     boolean showMetadata = Prefs.get("bioformats.showMetadata", false); 
    229     boolean groupFiles = Prefs.get("bioformats.groupFiles", false); 
    230     concatenate = Prefs.get("bioformats.concatenate", false); 
    231     boolean specifyRanges = Prefs.get("bioformats.specifyRanges", false); 
    232     stackFormat = Prefs.get("bioformats.stackFormat", VIEW_STANDARD); 
    233  
    234     final String mergeString = "Merge channels to RGB"; 
    235     final String colorizeString = "Colorize channels"; 
    236     final String splitString = "Open each channel in its own window"; 
    237     final String metadataString = "Display associated metadata"; 
    238     final String groupString = "Group files with similar names"; 
    239     final String concatenateString = "Concatenate compatible series"; 
    240     final String rangeString = "Specify range for each series"; 
    241     final String stackString = "View stack with: "; 
    242  
    243     // prompt for parameters, if necessary 
     300    // prompt user for parameters (or grab from macro options) 
    244301    gd = new GenericDialog("Bio-Formats Import Options"); 
    245302    gd.addCheckbox(mergeString, mergeChannels); 
     
    306363      if (groupFiles) { 
    307364        fs = new FileStitcher(r, true); 
    308         // prompt user to confirm detected file pattern 
    309         id = FilePattern.findPattern(new Location(id)); 
     365        // prompt user to confirm file pattern (or grab from macro options) 
     366        id = FilePattern.findPattern(idLoc); 
    310367        gd = new GenericDialog("Bio-Formats File Stitching"); 
    311368        int len = id.length() + 1; 
     
    713770            String label = sb.toString(); 
    714771 
    715             byte[] b = r.openBytes(j); 
     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            } 
    716804 
    717805            // construct image processor and add to stack 
     
    840928          if (stackB != null) { 
    841929            if (!mergeChannels && splitWindows) { 
    842               slice(stackB, sizeZ[i], sizeC[i], sizeT[i], 
    843                 fi, r, fs, specifyRanges, colorize); 
     930              slice(stackB, sizeZ[i], sizeC[i], sizeT[i], fi, r, fs, 
     931                specifyRanges, colorize, mergeChannels, concatenate, 
     932                stackFormat, quiet); 
    844933            } 
    845934            else imp = new ImagePlus(currentFile, stackB); 
     
    847936          if (stackS != null) { 
    848937            if (!mergeChannels && splitWindows) { 
    849               slice(stackS, sizeZ[i], sizeC[i], sizeT[i], 
    850                 fi, r, fs, specifyRanges, colorize); 
     938              slice(stackS, sizeZ[i], sizeC[i], sizeT[i], fi, r, fs, 
     939                specifyRanges, colorize, mergeChannels, concatenate, 
     940                stackFormat, quiet); 
    851941            } 
    852942            else imp = new ImagePlus(currentFile, stackS); 
     
    854944          if (stackF != null) { 
    855945            if (!mergeChannels && splitWindows) { 
    856               slice(stackF, sizeZ[i], sizeC[i], sizeT[i], 
    857                 fi, r, fs, specifyRanges, colorize); 
     946              slice(stackF, sizeZ[i], sizeC[i], sizeT[i], fi, r, fs, 
     947                specifyRanges, colorize, mergeChannels, concatenate, 
     948                stackFormat, quiet); 
    858949            } 
    859950            else imp = new ImagePlus(currentFile, stackF); 
     
    861952          if (stackO != null) { 
    862953            if (!mergeChannels && splitWindows) { 
    863               slice(stackO, sizeZ[i], sizeC[i], sizeT[i], 
    864                 fi, r, fs, specifyRanges, colorize); 
     954              slice(stackO, sizeZ[i], sizeC[i], sizeT[i], fi, r, fs, 
     955                specifyRanges, colorize, mergeChannels, concatenate, 
     956                stackFormat, quiet); 
    865957            } 
    866958            else imp = new ImagePlus(currentFile, stackO); 
     
    872964            imp.setFileInfo(fi); 
    873965            imp.setDimensions(cCount[i], zCount[i], tCount[i]); 
    874             displayStack(imp, r, fs); 
     966            displayStack(imp, r, fs, mergeChannels, 
     967              concatenate, stackFormat, quiet); 
    875968          } 
    876969 
     
    9611054      IJ.showStatus(""); 
    9621055      if (!quiet) { 
    963         String msg = exc.toString(); 
     1056        StringBuffer sb = new StringBuffer(); 
     1057        sb.append(exc.toString()); 
    9641058        StackTraceElement[] ste = exc.getStackTrace(); 
    965         for(int i = 0;i<ste.length;i++) { 
    966           msg = msg + "\n" + ste[i].toString(); 
    967         } 
     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(); 
    9681064        IJ.error("Bio-Formats", "Sorry, there was a problem " + 
    9691065          "reading the data" + (msg == null ? "." : (":\n" + msg))); 
     
    10401136 
    10411137  /** Opens each channel of the source stack in a separate window. */ 
    1042   private void slice(ImageStack is, int z, int c, int t, 
    1043     FileInfo fi, IFormatReader r, FileStitcher fs, boolean range, 
    1044     boolean colorize) throws FormatException, IOException 
     1138  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 
    10451142  { 
    10461143    int step = 1; 
     
    11071204      imp.setFileInfo(fi); 
    11081205      imp.setDimensions(1, r.getSizeZ(), r.getSizeT()); 
    1109       displayStack(imp, r, fs); 
     1206      displayStack(imp, r, fs, mergeChannels, concatenate, stackFormat, quiet); 
    11101207    } 
    11111208  } 
     
    11611258            bytes[ch1] = (byte[]) s.getProcessor(ndx).getPixels(); 
    11621259          } 
    1163           ColorProcessor cp = 
    1164             new ColorProcessor(s.getWidth(), s.getHeight()); 
     1260          ColorProcessor cp = new ColorProcessor(s.getWidth(), s.getHeight()); 
    11651261          cp.setRGB(bytes[0], bytes[1], bytes.length == 3 ? bytes[2] : 
    11661262            new byte[s.getWidth() * s.getHeight()]); 
     
    11741270 
    11751271  /** Displays the image stack using the appropriate plugin. */ 
    1176   private void displayStack(ImagePlus imp, IFormatReader r, FileStitcher fs) { 
     1272  private void displayStack(ImagePlus imp, IFormatReader r, FileStitcher fs, 
     1273    boolean mergeChannels, boolean concatenate, String stackFormat, 
     1274    boolean quiet) 
     1275  { 
    11771276    adjustDisplay(imp); 
    11781277 
     
    13171416      } 
    13181417    } 
    1319     catch (Exception e) { 
    1320       /* debug */ e.printStackTrace(); 
     1418    catch (Exception exc) { 
     1419      exc.printStackTrace(); 
    13211420      if (!concatenate) imp.show(); 
    13221421      else imps.add(imp); 
  • trunk/loci/plugins/LociImporter.java

    r2722 r2777  
    4141  // -- Fields -- 
    4242 
    43   /** Flag indicating whether last operation was successful. */ 
     43  /** 
     44   * Flag indicating whether last operation was successful. 
     45   * NB: This field must be updated properly, or the plugin 
     46   * will stop working correctly with HandleExtraFileTypes. 
     47   */ 
    4448  public boolean success; 
    4549 
    46   /** Flag indicating whether last operation was canceled. */ 
     50  /** 
     51   * Flag indicating whether last operation was canceled. 
     52   * NB: This field must be updated properly, or the plugin 
     53   * will stop working correctly with HandleExtraFileTypes. 
     54   */ 
    4755  public boolean canceled; 
    4856 
  • trunk/loci/plugins/plugins.config

    r2672 r2777  
    2222# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
    2323 
    24 #Plugins>LOCI, "4D Data Browser", loci.plugins.LociImporter("location=[Local machine] groupFiles stackFormat=[LOCI Data Browser]") 
    25 #Plugins>LOCI, "OME Plugin", loci.plugins.ome.OMEPlugin("") 
     24#Plugins>LOCI, "Bio-Formats Master Importer", loci.plugins.LociImporter("") 
     25Plugins>LOCI, "4D Data Browser", loci.plugins.LociImporter("location=[Local machine] group=true view=[4D Data Browser]") 
    2626Plugins>LOCI, "Bio-Formats Importer", loci.plugins.LociImporter("location=[Local machine]") 
    2727Plugins>LOCI, "Bio-Formats Exporter", loci.plugins.LociExporter("") 
Note: See TracChangeset for help on using the changeset viewer.