Changeset 2183


Ignore:
Timestamp:
01/30/07 11:48:26 (13 years ago)
Author:
melissa
Message:

Added OME image browser to VisBio. Also moved much of the connection and
retrieval logic from the OME plugin to loci.ome, for easier integration with
VisBio.

Location:
trunk/loci
Files:
5 added
1 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/apps/stitcher/MovieStitcher.java

    r2178 r2183  
    1414import java.awt.event.ActionEvent; 
    1515import java.awt.event.ActionListener; 
    16 import java.awt.image.BufferedImage; 
    17 import java.io.File; 
    18 import java.util.Arrays; 
     16import java.awt.image.*; 
     17import java.io.*; 
     18import java.util.Vector; 
    1919import javax.swing.*; 
    2020import javax.swing.border.EmptyBorder; 
     21import javax.swing.event.*; 
    2122import loci.formats.*; 
    22 import loci.formats.in.QTReader; 
    2323import loci.formats.out.TiffWriter; 
     24import org.openmicroscopy.xml.*; 
     25import org.openmicroscopy.xml.st.*; 
    2426 
    2527/** 
     
    2729 * TIFF series and other 4D datasets. 
    2830 */ 
    29 public class MovieStitcher extends JFrame implements ActionListener, Runnable { 
     31public class MovieStitcher extends JFrame implements  
     32  ActionListener, ChangeListener, Runnable  
     33{ 
    3034 
    3135  // -- Constants -- 
     
    3640  // -- Fields -- 
    3741 
    38   private ImageReader reader = new ImageReader(); 
    39   private TiffWriter writer = new TiffWriter(); 
     42  private FileStitcher reader = new FileStitcher(true); 
     43  private ImageWriter writer = new ImageWriter(); 
    4044  private JFileChooser rc, wc; 
    41   private boolean shutdown; 
     45  private boolean shutdown, force = true; 
    4246 
    4347  private JTextField input, output; 
    44   private JCheckBox qtJava, swapAxes, omeTiff; 
     48  private JCheckBox qtJava, forceType, includeZ, includeT, includeC; 
     49  private JLabel zLabel, tLabel, cLabel; 
     50  private JComboBox zChoice, tChoice, cChoice, codec; 
     51  private JSpinner fps, series; 
     52  private JPanel seriesRow; 
    4553  private JProgressBar progress; 
    4654  private JButton convert; 
     
    113121    row2.add(Box.createHorizontalStrut(4)); 
    114122 
     123    // save a blank row here 
     124    seriesRow = new RowPanel(); 
     125    seriesRow.setLayout(new BoxLayout(seriesRow, BoxLayout.X_AXIS)); 
     126    pane.add(seriesRow); 
     127 
    115128    // -- Row 3 -- 
    116129 
     
    121134    pane.add(Box.createVerticalStrut(9)); 
    122135 
     136    String[] axisNames = new String[] {"Time", "Slice", "Channel"}; 
     137 
     138    zLabel = new JLabel(" 1) Slice       <0-0>"); 
     139    tLabel = new JLabel(" 2) Time      <0-0>"); 
     140    cLabel = new JLabel(" 3) Channel <0-0>"); 
     141 
     142    zChoice = new JComboBox(axisNames); 
     143    zChoice.setSelectedIndex(1); 
     144    zChoice.setPreferredSize(new Dimension(5, 9)); 
     145    zChoice.setActionCommand("zChoice"); 
     146    zChoice.addActionListener(this); 
     147 
     148    tChoice = new JComboBox(axisNames); 
     149    tChoice.setSelectedIndex(0); 
     150    tChoice.setPreferredSize(new Dimension(5, 9)); 
     151    tChoice.setActionCommand("tChoice"); 
     152    tChoice.addActionListener(this); 
     153 
     154    cChoice = new JComboBox(axisNames); 
     155    cChoice.setSelectedIndex(2); 
     156    cChoice.setPreferredSize(new Dimension(5, 9)); 
     157    cChoice.setActionCommand("cChoice"); 
     158    cChoice.addActionListener(this); 
     159 
     160    includeZ = new JCheckBox("Include in file"); 
     161    includeZ.setEnabled(false); 
     162    includeT = new JCheckBox("Include in file"); 
     163    includeT.setEnabled(false); 
     164    includeC = new JCheckBox("Include in file"); 
     165    includeC.setEnabled(false); 
     166 
     167    row3.add(zLabel); 
     168    row3.add(zChoice); 
     169    row3.add(includeZ); 
     170    row3.add(Box.createHorizontalStrut(4)); 
     171     
     172    row3 = new RowPanel(); 
     173    row3.setLayout(new BoxLayout(row3, BoxLayout.X_AXIS)); 
     174    pane.add(row3); 
     175    pane.add(Box.createVerticalStrut(9)); 
     176     
     177    row3.add(tLabel); 
     178    row3.add(tChoice); 
     179    row3.add(includeT); 
     180    row3.add(Box.createHorizontalStrut(4)); 
     181     
     182    row3 = new RowPanel(); 
     183    row3.setLayout(new BoxLayout(row3, BoxLayout.X_AXIS)); 
     184    pane.add(row3); 
     185    pane.add(Box.createVerticalStrut(9)); 
     186     
     187    row3.add(cLabel); 
     188    row3.add(cChoice); 
     189    row3.add(includeC); 
     190 
     191    row3.add(Box.createHorizontalStrut(4)); 
     192 
     193    // -- Row 4 -- 
     194 
     195    JPanel row4 = new RowPanel(); 
     196    row4.setLayout(new BoxLayout(row4, BoxLayout.X_AXIS)); 
     197    pane.add(row4); 
     198 
     199    pane.add(Box.createVerticalStrut(9)); 
     200 
     201    JLabel fpsLabel = new JLabel("Frames per second: "); 
     202    row4.add(fpsLabel); 
     203    fps = new JSpinner(new SpinnerNumberModel(10, 1, 100, 1)); 
     204    row4.add(fps); 
     205    row4.add(Box.createHorizontalStrut(3)); 
     206   
     207    JLabel codecLabel = new JLabel("Output compression type: "); 
     208    row4.add(codecLabel); 
     209    codec = new JComboBox(new String[0]); 
     210    row4.add(codec); 
     211 
     212    // -- Row 5 -- 
     213 
     214    JPanel row5 = new RowPanel(); 
     215    row5.setLayout(new BoxLayout(row5, BoxLayout.X_AXIS)); 
     216    pane.add(row5); 
     217 
     218    pane.add(Box.createVerticalStrut(9)); 
     219 
    123220    boolean canDoQT = new LegacyQTTools().canDoQT(); 
    124221    qtJava = new JCheckBox("Use QTJava", canDoQT); 
    125222    qtJava.setEnabled(canDoQT); 
    126     row3.add(qtJava); 
    127  
    128     row3.add(Box.createHorizontalStrut(3)); 
    129  
    130     swapAxes = new JCheckBox("Swap axes", true); 
    131     row3.add(swapAxes); 
    132  
    133     row3.add(Box.createHorizontalStrut(3)); 
    134  
    135     omeTiff = new JCheckBox("OME-TIFF", true); 
    136     row3.add(omeTiff); 
    137  
    138     row3.add(Box.createHorizontalGlue()); 
     223    row5.add(qtJava); 
     224 
     225    row5.add(Box.createHorizontalStrut(3)); 
     226    
     227    forceType = new JCheckBox("Force", true); 
     228    forceType.setActionCommand("force"); 
     229    forceType.addActionListener(this); 
     230    row5.add(forceType); 
     231 
     232    row5.add(Box.createHorizontalStrut(3)); 
     233    row5.add(Box.createHorizontalGlue()); 
    139234 
    140235    convert = new JButton("Convert"); 
    141     row3.add(convert); 
     236    row5.add(convert); 
    142237    convert.setActionCommand("convert"); 
    143238    convert.addActionListener(this); 
    144239 
    145     row3.add(Box.createHorizontalStrut(4)); 
     240    row5.add(Box.createHorizontalStrut(4)); 
    146241 
    147242    JButton quit = new JButton("Quit"); 
    148     row3.add(quit); 
     243    row5.add(quit); 
    149244    quit.setActionCommand("quit"); 
    150245    quit.addActionListener(this); 
    151246 
    152     // -- Row 4 -- 
    153  
    154     JPanel row4 = new RowPanel(); 
    155     row4.setLayout(new BoxLayout(row4, BoxLayout.X_AXIS)); 
    156     pane.add(row4); 
     247    // -- Row 6 -- 
     248 
     249    JPanel row6 = new RowPanel(); 
     250    row6.setLayout(new BoxLayout(row6, BoxLayout.X_AXIS)); 
     251    pane.add(row6); 
    157252 
    158253    progress = new JProgressBar(); 
    159254    progress.setString(""); 
    160255    progress.setStringPainted(true); 
    161     row4.add(progress); 
    162  
    163     row4.add(Box.createHorizontalStrut(8)); 
     256    row6.add(progress); 
     257 
     258    row6.add(Box.createHorizontalStrut(8)); 
    164259 
    165260    JLabel version = new JLabel("Built on @date@"); 
    166261    version.setFont(version.getFont().deriveFont(Font.ITALIC)); 
    167     row4.add(version); 
     262    row6.add(version); 
    168263 
    169264    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     
    183278      String pattern = FilePattern.findPattern(file); 
    184279      input.setText(pattern); 
     280      
     281      try { 
     282        if (reader.getSeriesCount(pattern) > 1 && series == null) { 
     283          JLabel seriesLabel = new JLabel("Series: "); 
     284          series = new JSpinner(new SpinnerNumberModel(1, 1,  
     285            reader.getSeriesCount(pattern), 1));  
     286          series.addChangeListener(this); 
     287          seriesRow.add(seriesLabel); 
     288          seriesRow.add(series); 
     289          pack(); 
     290        } 
     291        else if (series != null) { 
     292          ((SpinnerNumberModel) series.getModel()).setMaximum( 
     293            new Integer(reader.getSeriesCount(pattern))); 
     294          pack(); 
     295        } 
     296        else if (reader.getSeriesCount(pattern) == 1 && series != null) { 
     297          seriesRow.remove(series); 
     298          series = null; 
     299          pack(); 
     300        } 
     301      } 
     302      catch (Exception exc) { 
     303        exc.printStackTrace(); 
     304      } 
     305       
     306      updateLabels(pattern);  
    185307    } 
    186308    else if ("output".equals(cmd)) { 
     
    190312      if (file != null) rc.setCurrentDirectory(file); 
    191313      String s = file.getPath(); 
    192       String name = file.getName(); 
    193       boolean isTiff = writer.isThisType(s); 
    194       if (!isTiff) s += ".tif"; 
    195314      output.setText(s); 
     315      try { 
     316        if (!writer.canDoStacks(s)) { 
     317          includeZ.setEnabled(false); 
     318          includeT.setEnabled(false); 
     319          includeC.setEnabled(false); 
     320        } 
     321        codec.removeAllItems(); 
     322        String[] codecs = writer.getWriter(s).getCompressionTypes(); 
     323        if (codecs == null) codecs = new String[] {"Uncompressed"}; 
     324        for (int i=0; i<codecs.length; i++) { 
     325          codec.addItem(codecs[i]); 
     326        } 
     327      } 
     328      catch (Exception exc) { 
     329        exc.printStackTrace(); 
     330      } 
     331    } 
     332    else if ("zChoice".equals(cmd)) { 
     333      String newName = (String) zChoice.getSelectedItem(); 
     334      String label = zLabel.getText(); 
     335      String oldName = label.substring(4, label.indexOf(" ", 4)); 
     336      label = label.replaceAll(oldName, newName); 
     337      zLabel.setText(label); 
     338    } 
     339    else if ("tChoice".equals(cmd)) { 
     340      String newName = (String) tChoice.getSelectedItem(); 
     341      String label = tLabel.getText(); 
     342      String oldName = label.substring(4, label.indexOf(" ", 4)); 
     343      label = label.replaceAll(oldName, newName); 
     344      tLabel.setText(label); 
     345    } 
     346    else if ("cChoice".equals(cmd)) { 
     347      String newName = (String) cChoice.getSelectedItem(); 
     348      String label = cLabel.getText(); 
     349      String oldName = label.substring(4, label.indexOf(" ", 4)); 
     350      label = label.replaceAll(oldName, newName); 
     351      cLabel.setText(label); 
    196352    } 
    197353    else if ("convert".equals(cmd)) new Thread(this).start(); 
     354    else if ("force".equals(cmd)) { 
     355      force = forceType.isSelected(); 
     356    } 
    198357    else if ("quit".equals(cmd)) { 
    199358      shutdown = true; 
     
    203362    } 
    204363  } 
     364  
     365  // -- ChangeListener methods -- 
     366 
     367  public void stateChanged(ChangeEvent e) { 
     368    if (e.getSource() == series) { 
     369      try { 
     370        reader.setSeries(reader.getCurrentFile(),  
     371          ((Integer) series.getValue()).intValue() - 1); 
     372        updateLabels(input.getText()); 
     373      } 
     374      catch (Exception exc) { 
     375        exc.printStackTrace(); 
     376      } 
     377    } 
     378  } 
     379 
    205380 
    206381  // -- Runnable methods -- 
     
    208383  public void run() { 
    209384    convert.setEnabled(false); 
     385    includeZ.setEnabled(false); 
     386    includeT.setEnabled(false); 
     387    includeC.setEnabled(false); 
     388    zChoice.setEnabled(false); 
     389    tChoice.setEnabled(false); 
     390    cChoice.setEnabled(false); 
     391    input.setEditable(false); 
     392 
    210393    progress.setString("Getting ready"); 
    211394    try { 
     
    218401        return; 
    219402      } 
    220  
    221       FilePattern fp = new FilePattern(in); 
    222       String[] inFiles = fp.getFiles(); 
    223  
    224       boolean isQT = reader.getFormat(in).equals("QuickTime"); 
     403      if (out.trim().equals("")) { 
     404        File f = new File(in); 
     405        String name = new FilePattern(in).getPrefix(); 
     406        String stitchDir = name + "-stitched"; 
     407        new File(f.getParent() + File.separator + stitchDir).mkdir(); 
     408        out = f.getParent() + File.separator + stitchDir +  
     409          File.separator + name + ".tif";  
     410        out = out.replaceAll(File.separator + File.separator, File.separator); 
     411        output.setText(out); 
     412      } 
     413      output.setEditable(false); 
     414  
     415      if (series != null) { 
     416        reader.setSeries(in, ((Integer) series.getValue()).intValue() - 1); 
     417      } 
     418 
     419      writer.setFramesPerSecond(((Integer) fps.getValue()).intValue()); 
     420      try { 
     421        writer.getWriter(out).setCompression((String) codec.getSelectedItem()); 
     422      } 
     423      catch (NullPointerException npe) { } 
     424 
     425      boolean isQT = reader.getFormat().equals("QuickTime"); 
    225426      boolean useQTJ = isQT && qtJava.isSelected(); 
    226       ((QTReader) reader.getReader(QTReader.class)).setLegacy(useQTJ); 
    227  
    228       int numT = reader.getImageCount(inFiles[0]); 
    229       int numZ = inFiles.length; 
    230       boolean swap = swapAxes.isSelected(); 
    231       int outFiles = swap ? numT : numZ; 
    232       int outPlanes = swap ? numZ : numT; 
     427      //((QTReader) reader.getReader(QTReader.class)).setLegacy(useQTJ); 
     428 
     429      // swap dimensions based on user input 
     430 
     431      String order = reader.getDimensionOrder(in); 
     432       
     433      if (zLabel.getText().indexOf("Time") != -1) { 
     434        order = order.replace('Z', 'T') ; 
     435      } 
     436      else if (zLabel.getText().indexOf("Channel") != -1) { 
     437        order = order.replace('Z', 'C'); 
     438      } 
     439 
     440      if (tLabel.getText().indexOf("Slice") != -1) { 
     441        order = order.replace('T', 'Z'); 
     442      } 
     443      else if (tLabel.getText().indexOf("Channel") != -1) { 
     444        order = order.replace('T', 'C'); 
     445      } 
     446 
     447      if (cLabel.getText().indexOf("Time") != -1) { 
     448        order = order.replace('C', 'T'); 
     449      } 
     450      else if (cLabel.getText().indexOf("Slice") != -1) { 
     451        order = order.replace('C', 'Z'); 
     452      } 
     453 
     454      reader.swapDimensions(in, order); 
     455 
     456      OMEXMLMetadataStore store = new OMEXMLMetadataStore(); 
     457      store.createRoot(); 
     458      reader.close(); 
     459      reader.setMetadataStore(store); 
     460 
     461      // determine internal and external dimensions for each axis 
     462 
     463      int internalZ = includeZ.isSelected() ? reader.getSizeZ(in) : 1; 
     464      int internalT = includeT.isSelected() ? reader.getSizeT(in) : 1; 
     465      int internalC = includeC.isSelected() ? reader.getEffectiveSizeC(in) : 1; 
     466 
     467      int externalZ = includeZ.isSelected() ? 1 : reader.getSizeZ(in); 
     468      int externalT = includeT.isSelected() ? 1 : reader.getSizeT(in); 
     469      int externalC = includeC.isSelected() ? 1 : reader.getEffectiveSizeC(in); 
     470 
     471      int numFiles = externalZ * externalT * externalC; 
     472 
     473      int zDigits = ("" + externalZ).length(); 
     474      int tDigits = ("" + externalT).length(); 
     475      int cDigits = ("" + externalC).length(); 
     476 
     477      progress.setMaximum(2 * reader.getImageCount(in)); 
    233478 
    234479      int star = out.lastIndexOf("."); 
     
    237482      String post = out.substring(star); 
    238483 
    239       progress.setMaximum(2 * numZ * numT); 
     484      // determine appropriate pixel type 
     485 
     486      int type = reader.getPixelType(in); 
     487      if (force && !writer.isSupportedType(out, type)) { 
     488        int[] types = writer.getPixelTypes(out); 
     489        for (int i=0; i<types.length; i++) { 
     490          if (types[i] > type) { 
     491            if (i == 0) { 
     492              type = types[i]; 
     493              break; 
     494            } 
     495            else { 
     496              type = types[i - 1]; 
     497              break; 
     498            } 
     499          } 
     500          if (i == types.length - 1) type = types[i]; 
     501        } 
     502      } 
     503      else if (!force && !writer.isSupportedType(out, type)) { 
     504        throw new FormatException("Unsupported pixel type: " +  
     505          FormatReader.getPixelTypeString(type) + 
     506          "\nTo write to this format, the \"force\" box must be checked.\n" + 
     507          "This may result in a loss of precision; for best results, " + 
     508          "convert to TIFF instead."); 
     509      } 
     510 
    240511      long start = System.currentTimeMillis(); 
    241  
    242       IFormatReader[] readers = null; 
    243       TiffWriter[] writers = null; 
    244       if (swap) { 
    245         if (useQTJ) { 
    246           // write to multiple files at once, for efficiency 
    247           // (to avoid multiple simultaneous QTJava readers, 
    248           // or storing multiple images in RAM simultaneously) 
    249           writers = new TiffWriter[outFiles]; 
    250           writers[0] = writer; 
    251           for (int i=1; i<writers.length; i++) writers[i] = new TiffWriter(); 
    252         } 
    253         else { 
    254           // read from multiple files at once, for efficiency 
    255           // (to avoid writing to multiple files at once, 
    256           // or storing multiple images in RAM simultaneously) 
    257           readers = new IFormatReader[inFiles.length]; 
    258           IFormatReader r = reader.getReader(inFiles[0]); 
    259           if (outFiles == 1) Arrays.fill(readers, r); 
    260           else { 
    261             readers[0] = r; 
    262             Class c = r.getClass(); 
    263             for (int i=1; i<readers.length; i++) { 
    264               readers[i] = (IFormatReader) c.newInstance(); 
     512      int plane = 0; 
     513 
     514      for (int i=0; i<externalZ; i++) { 
     515        for (int j=0; j<externalT; j++) { 
     516          for (int k=0; k<externalC; k++) { 
     517            // construct the numeric blocks 
     518            String zBlock = ""; 
     519            String tBlock = ""; 
     520            String cBlock = ""; 
     521             
     522            if (externalZ > 1) { 
     523              String num = "" + i; 
     524              while (num.length() < zDigits) num = "0" + num; 
     525              zBlock = "Z" + num + "_"; 
     526            } 
     527            if (externalT > 1) { 
     528              String num = "" + j; 
     529              while (num.length() < tDigits) num = "0" + num; 
     530              tBlock = "T" + num + "_"; 
     531            } 
     532            if (externalC > 1) { 
     533              String num = "" + k; 
     534              while (num.length() < cDigits) num = "0" + num; 
     535              cBlock = "C" + num; 
     536            } 
     537 
     538            String outFile = pre; 
     539            if (zBlock.length() > 1) outFile += zBlock; 
     540            if (tBlock.length() > 1) outFile += tBlock; 
     541            if (cBlock.length() > 1) outFile += cBlock; 
     542            if (outFile.endsWith("_")) { 
     543              outFile = outFile.substring(0, outFile.length() - 1); 
     544            } 
     545            outFile += post; 
     546 
     547            String outName = new File(outFile).getName(); 
     548 
     549            int planesPerFile = internalZ * internalT * internalC; 
     550            int filePlane = 0; 
     551     
     552            for (int z=0; z<internalZ; z++) { 
     553              for (int t=0; t<internalT; t++) { 
     554                for (int c=0; c<internalC; c++) { 
     555                  int zPos = z*externalZ + i; 
     556                  int tPos = t*externalT + j; 
     557                  int cPos = c*externalC + k; 
     558                  
     559                  progress.setString(outName + " " + (filePlane + 1) + 
     560                    "/" + planesPerFile); 
     561                  filePlane++; 
     562                  progress.setValue(2 * (plane + 1)); 
     563                  plane++; 
     564                  int ndx = reader.getIndex(in, zPos, cPos, tPos); 
     565 
     566                  BufferedImage img = reader.openImage(in, ndx); 
     567                  if (force &&  
     568                    !writer.isSupportedType(out, reader.getPixelType(in)))  
     569                  { 
     570                    int pixelType = 0; 
     571                    switch (type) { 
     572                      case FormatReader.INT8: 
     573                      case FormatReader.UINT8:  
     574                        pixelType = DataBuffer.TYPE_BYTE; 
     575                        break; 
     576                      case FormatReader.INT16:  
     577                        pixelType = DataBuffer.TYPE_USHORT; 
     578                        break; 
     579                      case FormatReader.UINT16:  
     580                        pixelType = DataBuffer.TYPE_SHORT; 
     581                        break; 
     582                      case FormatReader.INT32: 
     583                      case FormatReader.UINT32:  
     584                        pixelType = DataBuffer.TYPE_INT; 
     585                        break; 
     586                      case FormatReader.FLOAT:  
     587                        pixelType = DataBuffer.TYPE_FLOAT; 
     588                        break; 
     589                      case FormatReader.DOUBLE: 
     590                        pixelType = DataBuffer.TYPE_DOUBLE; 
     591                        break;  
     592                    } 
     593                    img = ImageTools.makeType(img, pixelType); 
     594                  } 
     595 
     596                  writer.save(outFile, img, shutdown ||  
     597                    (filePlane == planesPerFile)); 
     598                  if (shutdown) break; 
     599                } 
     600              } 
     601            } 
     602           
     603            // if we're writing a TIFF file, insert an OME-XML block  
     604            if (writer.getWriter(outFile) instanceof TiffWriter) { 
     605              RandomAccessFile raf = new RandomAccessFile(outFile, "rw"); 
     606               
     607              OMENode root = (OMENode)  
     608                ((OMEXMLMetadataStore) reader.getMetadataStore(in)).getRoot(); 
     609                 
     610              // add TiffData element here  
     611              Vector images = root.getChildren("Image"); 
     612              for (int p=0; p<images.size(); p++) { 
     613                PixelsNode pix =  
     614                  (PixelsNode) ((ImageNode) images.get(p)).getDefaultPixels(); 
     615                DOMUtil.createChild(pix.getDOMElement(), "TiffData"); 
     616              } 
     617 
     618              TiffTools.overwriteIFDValue(raf, 0, TiffTools.IMAGE_DESCRIPTION, 
     619                root.writeOME(true)); 
     620              raf.close(); 
    265621            } 
    266622          } 
     
    268624      } 
    269625 
    270       int digits = ("" + outFiles).length(); 
    271       if (swap && useQTJ) { 
    272         // for each input file, write to all output files 
    273         for (int p=0; p<outPlanes; p++) { 
    274           for (int o=0; o<outFiles; o++) { 
    275             String num = "" + (o + 1); 
    276             while (num.length() < digits) num = "0" + num; 
    277             String outFile = outFiles == 1 ? (pre + post) : (pre + num + post); 
    278             String outName = new File(outFile).getName(); 
    279             progress.setString(outName + " " + (p + 1) + "/" + outPlanes); 
    280             int value = 2 * (p * outFiles + o); 
    281             progress.setValue(value); 
    282             BufferedImage img = 
    283               reader.openImage(inFiles[p], o); // p <=> Z, o <=> T 
    284             progress.setValue(value + 1); 
    285             writers[o].save(outFile, img, shutdown || p == outPlanes - 1); 
    286             if (shutdown) break; 
    287           } 
    288           if (shutdown) break; 
    289         } 
    290       } 
    291       else { 
    292         // write each output file sequentially 
    293         for (int o=0; o<outFiles; o++) { 
    294           String num = "" + (o + 1); 
    295           while (num.length() < digits) num = "0" + num; 
    296           String outFile = outFiles == 1 ? (pre + post) : (pre + num + post); 
    297           String outName = new File(outFile).getName(); 
    298           for (int p=0; p<outPlanes; p++) { 
    299             progress.setString(outName + " " + (p + 1) + "/" + outPlanes); 
    300             int value = 2 * (o * outPlanes + p); 
    301             progress.setValue(value); 
    302             BufferedImage img = swap ? 
    303               readers[p].openImage(inFiles[p], o) : // p <=> Z, o <=> T 
    304               reader.openImage(inFiles[o], p); // p <=> T, o <=> Z 
    305             progress.setValue(value + 1); 
    306             writer.save(outFile, img, shutdown || p == outPlanes - 1); 
    307             if (shutdown) break; 
    308           } 
    309           if (shutdown) break; 
    310         } 
    311       } 
    312       progress.setValue(2 * numZ * numT); 
     626      progress.setValue(2 * reader.getImageCount(in)); 
    313627      progress.setString("Finishing"); 
    314       if (readers == null) reader.close(); 
    315       else { 
    316         for (int i=0; i<readers.length; i++) readers[i].close(); 
    317       } 
     628      if (writer != null) writer.close(); 
    318629 
    319630      long end = System.currentTimeMillis(); 
    320631      double time = (end - start) / 1000.0; 
    321       long avg = (end - start) / (numZ * numT); 
     632      long avg = (end - start) / (reader.getImageCount(in)); 
    322633      progress.setString(time + " s elapsed (" + avg + " ms/plane)"); 
    323634      progress.setValue(0); 
     635      if (reader != null) reader.close(); 
    324636    } 
    325637    catch (Exception exc) { 
     
    332644    } 
    333645    convert.setEnabled(true); 
     646    includeZ.setEnabled(true); 
     647    includeT.setEnabled(true); 
     648    includeC.setEnabled(true); 
     649    zChoice.setEnabled(true); 
     650    tChoice.setEnabled(true); 
     651    cChoice.setEnabled(true); 
     652    input.setEditable(true); 
     653    output.setEditable(true); 
    334654  } 
    335655 
     
    344664  private void msg(String msg) { 
    345665    JOptionPane.showMessageDialog(this, msg, TITLE, JOptionPane.ERROR_MESSAGE); 
     666  } 
     667 
     668  private void updateLabels(String pattern) { 
     669    try { 
     670      String z = zLabel.getText(); 
     671      z = z.substring(0, z.indexOf("<")); 
     672      z += "<1-" + reader.getSizeZ(pattern) + ">"; 
     673      zLabel.setText(z); 
     674 
     675      String t = tLabel.getText(); 
     676      t = t.substring(0, t.indexOf("<")); 
     677      t += "<1-" + reader.getSizeT(pattern) + ">"; 
     678      tLabel.setText(t); 
     679 
     680      String c = cLabel.getText(); 
     681      c = c.substring(0, c.indexOf("<")); 
     682      c += "<1-" + reader.getEffectiveSizeC(pattern) + ">"; 
     683      cLabel.setText(c); 
     684       
     685      includeZ.setEnabled(true); 
     686      includeT.setEnabled(true); 
     687      includeC.setEnabled(true); 
     688    } 
     689    catch (Exception exc) { 
     690      exc.printStackTrace(); 
     691    } 
    346692  } 
    347693 
  • trunk/loci/formats/OMEXMLMetadataStore.java

    r2178 r2183  
    7676    catch (ParserConfigurationException exc) { exc.printStackTrace(); } 
    7777    catch (IOException exc) { exc.printStackTrace(); } 
     78  } 
     79 
     80  /**  
     81   * Copies all of the data from this OMEXMLMetadataStore to a different 
     82   * MetadataStore. 
     83   */ 
     84  public void copyData(MetadataStore store) { 
    7885  } 
    7986 
     
    436443  { 
    437444    int ndx = i == null ? 0 : i.intValue(); 
    438     // TODO find a better way to specify which Pixels we want 
     445    
    439446    ImageNode image = (ImageNode) getChild(root, "Image", ndx); 
    440447    CustomAttributesNode ca = (CustomAttributesNode) 
  • trunk/loci/formats/in/OMEReader.java

    r2182 r2183  
    198198    pf = null; 
    199199    pixels = null; 
     200    currentId = null; 
     201    loginString = null; 
    200202  } 
    201203 
  • trunk/loci/plugins/IJ_Props.txt

    r1794 r2183  
    269269plug-in10="Bio-Formats Importer",loci.plugins.LociImporter 
    270270plug-in11="Bio-Formats Exporter",loci.browser.LociDataBrowser 
    271 plug-in12="OME Plugin",loci.plugins.ome.OMEPlugin 
     271plug-in12="OME Plugin",loci.plugins.OMEPlugin 
    272272 
    273273# Install user plugins located in ij.jar 
  • trunk/loci/plugins/Importer.java

    r2178 r2183  
    155155      } 
    156156      else if (LOCATION_OME.equals(location)) { 
    157         IJ.runPlugIn("loci.plugins.ome.OMEPlugin", ""); 
     157        IJ.runPlugIn("loci.plugins.OMEPlugin", ""); 
    158158        return; 
    159159      } 
  • trunk/loci/visbio/ome/OMEImage.java

    r2146 r2183  
    3030import loci.formats.*; 
    3131import loci.formats.in.OMEReader; 
     32import loci.ome.OMEUtils; 
    3233import loci.visbio.*; 
    3334import loci.visbio.data.*; 
     
    208209      // get image ID to download 
    209210      if (imageId < 0) { 
    210         String id = (String) JOptionPane.showInputDialog(parent, "Image ID:", 
    211           "Download OME image", JOptionPane.INFORMATION_MESSAGE, 
    212           null, null, ""); 
    213         if (id == null) return null; 
    214         try { imageId = Integer.parseInt(id); } 
    215         catch (NumberFormatException exc) { } 
     211        try { 
     212        OMEUtils.login(server, user, password); 
     213        
     214        // TODO : find a better way of handling multiple IDs 
     215        int[] results = OMEUtils.showTable(OMEUtils.getAllImages()); 
     216        if (results.length > 0) { 
     217          imageId = results[0]; 
     218        } 
     219        else imageId = -1; 
     220        } 
     221        catch (Exception e) { 
     222          e.printStackTrace(); 
     223          JOptionPane.showMessageDialog(parent, "Sorry, there has been a " + 
     224            "problem downloading from the server. Please try again.", 
     225            "VisBio", JOptionPane.ERROR_MESSAGE); 
     226          imageId = -1; 
     227        } 
    216228      } 
    217229      if (imageId < 0) return null; 
Note: See TracChangeset for help on using the changeset viewer.