/*-
* #%L
* Fiji distribution of ImageJ for the life sciences.
* %%
* Copyright (C) 2007 - 2017 Fiji developers.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-2.0.html>.
* #L%
*/
package spim.fiji.plugin;
import fiji.util.gui.GenericDialogPlus;
import ij.gui.GenericDialog;
import ij.plugin.PlugIn;
import java.awt.Checkbox;
import java.awt.Color;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
import java.io.File;
import java.util.ArrayList;
import mpicbg.spim.data.SpimDataException;
import mpicbg.spim.io.IOFunctions;
import spim.fiji.plugin.cluster.MergeClusterJobs;
import spim.fiji.plugin.queryXML.GenericLoadParseQueryXML;
import spim.fiji.plugin.util.GUIHelper;
public class Merge_Cluster_Jobs implements PlugIn
{
public static String defaultContains1 = "job_";
public static String defaultContains2 = ".xml";
public static String defaultNewXML = "dataset_merged.xml";
public static String defaultMergeXMLDir = null;
public static boolean defaultDeleteXMLs = false;
public static boolean defaultDisplayXMLs = true;
public static boolean ignoreTileFiles = true;
Color color = GUIHelper.neutral;
String message = "---";
ArrayList< File > xmls = new ArrayList< File >();
// run("Merge Cluster Jobs", "directory=/Users/preibischs/Downloads/A_SPIM_new_pipeline filename_contains=job_ filename_also_contains=.xml display merged_xml=dataset_merged.xml");
@Override
public void run( String arg0 )
{
final GenericDialogPlus gd = new GenericDialogPlus( "Select XML's to Merge" );
if ( defaultMergeXMLDir == null )
defaultMergeXMLDir = new File( GenericLoadParseQueryXML.defaultXMLfilename ).getParent();
gd.addDirectoryField( "Directory", defaultMergeXMLDir, 50 );
gd.addStringField( "Filename_contains", defaultContains1 );
gd.addStringField( "Filename_also_contains", defaultContains2 );
final TextField directory = (TextField)gd.getStringFields().firstElement();
final TextField contains1 = (TextField)gd.getStringFields().get( 1 );
final TextField contains2 = (TextField)gd.getStringFields().get( 2 );
gd.addStringField( "Merged_XML", defaultNewXML, 50 );
gd.addCheckbox( "Display currently selected XML's in log window", defaultDisplayXMLs );
final Checkbox display = (Checkbox)gd.getCheckboxes().firstElement();
gd.addCheckbox( "Delete_XML's after successful merge", defaultDeleteXMLs );
// a first run
findFiles( new File( directory.getText() ), contains1.getText(), contains2.getText(), defaultDisplayXMLs );
gd.addMessage( "" );
gd.addMessage( this.message, GUIHelper.largestatusfont, this.color );
final Label target = (Label)gd.getMessage();
addListeners( gd, directory, contains1, contains2, display, target );
gd.showDialog();
if ( gd.wasCanceled() )
return;
final String dir = defaultMergeXMLDir = gd.getNextString();
final String cont1 = defaultContains1 = gd.getNextString();
final String cont2 = defaultContains2 = gd.getNextString();
defaultDisplayXMLs = gd.getNextBoolean();
final boolean delete = defaultDeleteXMLs = gd.getNextBoolean();
final File newXML = new File( dir, defaultNewXML = gd.getNextString() );
IOFunctions.println( "Attempting to merge the following XML's in directory '" + dir + "':" );
findFiles( new File( dir ), cont1, cont2, false );
for ( final File f : this.xmls )
IOFunctions.println( " " + f.getAbsolutePath() );
try
{
MergeClusterJobs.merge( xmls, newXML );
IOFunctions.println( "Successfully merged all XML's into one new XML: " + newXML.getAbsolutePath() );
if ( delete )
{
IOFunctions.println( "Deleting all input XML's." );
for ( final File f : this.xmls )
f.delete();
IOFunctions.println( "Done." );
}
}
catch ( final SpimDataException e )
{
IOFunctions.println( "Failed to merge XML's: " + e );
e.printStackTrace();
}
}
protected void addListeners(
final GenericDialog gd,
final TextField directory,
final TextField contains1,
final TextField contains2,
final Checkbox display,
final Label label )
{
directory.addTextListener( new TextListener()
{
@Override
public void textValueChanged( final TextEvent t )
{
if ( t.getID() == TextEvent.TEXT_VALUE_CHANGED )
{
findFiles( new File( directory.getText() ), contains1.getText(), contains2.getText(), display.getState() );
update( label );
}
}
});
contains1.addTextListener( new TextListener()
{
@Override
public void textValueChanged( final TextEvent t )
{
if ( t.getID() == TextEvent.TEXT_VALUE_CHANGED )
{
findFiles( new File( directory.getText() ), contains1.getText(), contains2.getText(), display.getState() );
update( label );
}
}
});
contains2.addTextListener( new TextListener()
{
@Override
public void textValueChanged( final TextEvent t )
{
if ( t.getID() == TextEvent.TEXT_VALUE_CHANGED )
{
findFiles( new File( directory.getText() ), contains1.getText(), contains2.getText(), display.getState() );
update( label );
}
}
});
display.addItemListener( new ItemListener()
{
@Override
public void itemStateChanged( final ItemEvent i )
{
if ( i.getID() == ItemEvent.ITEM_STATE_CHANGED )
{
findFiles( new File( directory.getText() ), contains1.getText(), contains2.getText(), display.getState() );
update( label );
}
}
});
}
protected void update( final Label label )
{
label.setText( this.message );
label.setForeground( this.color );
}
protected void findFiles( final File dir, final String contains1, final String contains2, final boolean display )
{
this.xmls.clear();
if ( !dir.isDirectory() )
{
this.message = "Path provided is not a directory.";
this.color = GUIHelper.error;
}
else
{
for ( final String file : dir.list() )
{
if ( ignoreTileFiles )
{
if ( file.contains( contains1 ) && file.contains( contains2 ) && !file.contains( "~" ) )
this.xmls.add( new File( dir, file ) );
}
else
{
if ( file.contains( contains1 ) && file.contains( contains2 ) )
this.xmls.add( new File( dir, file ) );
}
}
if ( this.xmls.size() == 0 )
{
this.message = "No files found that match the name pattern.";
this.color = GUIHelper.warning;
}
else
{
this.message = "Found " + this.xmls.size() + " files that match the name pattern.";
this.color = GUIHelper.good;
if ( display )
{
IOFunctions.println( "Currently selected XML's: " );
for ( final File f : this.xmls )
IOFunctions.println( " " + f.getAbsolutePath() );
}
}
}
}
public static void main( String[] args )
{
new Merge_Cluster_Jobs().run( null );
}
}