/*
* Copyright (c) 2012 European Synchrotron Radiation Facility,
* Diamond Light Source Ltd.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package fable.framework.navigator.views;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Vector;
import java.util.regex.Pattern;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.XMLMemento;
import org.eclipse.ui.part.ViewPart;
import org.slf4j.Logger;
import fable.framework.logging.FableLogger;
import fable.framework.navigator.Activator;
import fable.framework.navigator.actions.OpenFilesAction;
import fable.framework.navigator.actions.OpensampleAction;
import fable.framework.navigator.controller.SampleController;
import fable.framework.navigator.preferences.FabioPreferenceConstants;
import fable.framework.navigator.toolBox.IImagesKeys;
import fable.framework.navigator.toolBox.IVarKeys;
import fable.framework.toolbox.StringText;
import fable.framework.toolbox.ToolBox;
import fable.framework.views.FableMessageConsole;
import fable.python.Experiment;
import fable.python.Sample;
import fable.python.SampleException;
import fable.python.contentprovider.SampleTableContentProvider;
import fable.python.labelprovider.SampleTablelabelProvider;
import org.dawb.fabio.FabioFile;
import org.dawb.fabio.FabioFileException;
public class SampleNavigatorView extends ViewPart implements
IPropertyChangeListener {
public static final String ID = "fable.framework.navigator.views.SampleNavigatorViewid";
public static final String INITIAL_DIR_DATA = "initialDirData";
/** Image delete used in button remove. */
final Image imgDelete;
/** Image add used in button add a header key. */
final Image imgadd;
/** Image remove used to remove a column header key in the table. */
final Image imgRemove;
/** Image update to update files in the current directory. */
final Image imgUpdate;
/** Image apply for button apply filter. */
final Image imgApply;
/** Image clear for button clear filter. */
final Image imgClear;
/** Image open files for the view action. */
final Image imgOpenFiles;
/** Image open directory for menu open directory. */
final Image imgOpenDirectory;
/** Color blue for file table <code>fileTable</code> */
final Color light_blue = new Color(Display.getCurrent(), 228, 247, 248);
/** Uniq instance of this view <code>SampleNavigatorView</code>. */
public static SampleNavigatorView view;
/** This singleton is the model controller. */
public static SampleController controller = SampleController
.getController();
/** Image descriptor for delete. */
private ImageDescriptor GifDelete = Activator.imageDescriptorFromPlugin(
Activator.PLUGIN_ID, IImagesKeys.BTN_IMG_DELETE);
/** Image descriptor for remove. */
private ImageDescriptor GifRemove = Activator.imageDescriptorFromPlugin(
Activator.PLUGIN_ID, IImagesKeys.BTN_IMG_SUBTRACT);
/** Image descriptor for add. */
private ImageDescriptor GifAdd = Activator.imageDescriptorFromPlugin(
Activator.PLUGIN_ID, IImagesKeys.BTN_IMG_ADD);
/** Image descriptor for update. */
private ImageDescriptor updateImgDescriptor = Activator
.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
IImagesKeys.BTN_IMG_UPDATE);
/** Image descriptor for open files menu. */
private ImageDescriptor imageFiles = Activator
.getImageDescriptor("images/openFiles.gif");
/** Image descriptor for open directory menu. */
private ImageDescriptor imageSample = Activator
.getImageDescriptor("images/openFolder.gif");
/** Image descriptor for apply filter. */
private ImageDescriptor imageApply = Activator.imageDescriptorFromPlugin(
Activator.PLUGIN_ID, IImagesKeys.BTN_IMG_APPLY);
/** The current display. */
private Display display;
/** The initial directory used in <code>memento</code>. */
private static String initialDirData = null;
/** this is the name of the parent directory of a selected directory. */
String experimentName = "";
/** This is the name of the current directory. */
String sampleName = "";
/** This is the directory fullpath. */
String sSampleDirectory; // current sample directory
/** An array list to register SampleNavigator change event listener. */
private ArrayList<IPropertyChangeListener> array = new ArrayList<IPropertyChangeListener>();
/**
* This is the current directory selected in the table
* <code>sampleTable</code>.
*/
private Sample currentSample;
/** This is a list of keys added to the table <code>fileTable</code>. */
private List listKeys;
/** This is a vector of titles for table <code>fileTable</code>. */
private Vector<String> titles = new Vector<String>();
/** A sort listener for table <code>fileTable</code> */
private Listener sortListener;
/** Current selected column for files table. */
private TableColumn columnSelected;
/** A button to add a key in <code>fileTable</code> */
private Button addKeyInTab;
/** A button to remove a key in <code>fileTable</code> */
private Button removeKeyInTable;
/** This table list files of the current directory. */
private Table fileTable;
private TableViewer fileTableViewer;
/** This button removes selected file or selected directory. */
private Button btnRemoveSelect;
/** This button updates files in the table for the current directory. */
private Button btnUpdate;
/**
* This button automatically updates files in the table for the current
* directory.
*/
private Button btnAutoUpdate;
/** A table viewer for directory. On the let side of the sash. */
private TableViewer sampleTable;
/** The sash the */
private SashForm sash;
/** Index of selected column for table <code>fileTable</code> */
private int columnIndexSelected = -1;
/**
* This is a list of directories loaded in the view. This is the same
* instance as controller.vsample
*/
private Vector<Sample> listOfSamples;
/**
* This is a vector of fabio files of the current directory (selected
* directory) sorted by name. <br>
* <code>sort = currentSample.getSortedFiles();</code>
*/
private Vector<FabioFile> sort;
/** This is the current selected file. */
private FabioFile f_fabio;// current selected file
/** This job i used to add directory to this view. */
private Job job;
/** A logger to track problems. */
private Logger logger;
/**
* Complete regular expression based on preferences to load only files with
* extension that composed this expresion. <br>
* For example: <code>expression = "edf | bruker | edf.gz"</code>. <BR>
* Usage: regularExpressionForExtension =
* fable.framework.navigator.Activator.getDefault()
* .getPreferenceStore().getString( SampleNavigatorPreferences.FILE_TYPE);//
* Activator.getDefault().getPreferenceStore().getString(;
* PeaksearchPreferencesPage .FILE_INI));
*/
String regularExpressionForExtension;
/** A listener on preferences property change. */
private IPropertyChangeListener preferencesListener;
/***/
org.eclipse.core.runtime.IStatus job_status = Status.OK_STATUS;
/** Open directory action for local menu. */
private OpensampleAction actionOpensample;
/** Open files action for local menu. */
private OpenFilesAction actionOpenFiles;
/** Current filter on file table. */
private String filter = "";
/** Text field for filter. */
private StringText textFilter;
/** Button to apply filter. */
private Button btnApplyfilter;
/** Clear button to reset filter. */
private Button btnClearfilter;
/**
* Text field, disabled to display filter message info. For example 12/15
* files.
*/
private Text labelTextFilter;
/** A global boolean to know if filter is applied or not. */
private boolean applyFilter = false;
/** a global flag to indicate if automatic update has been selected or not */
private boolean autoUpdate = false;
private Job autoUpdateJob;
// private Slice1DAction slice1DAction;
/**
* Context menu manager for the file table.
*/
MenuManager contextMenuMgr;
/**
*
* @description constructor. Init images and sortListener to sort in table
* files
*/
public SampleNavigatorView() {
imgDelete = GifDelete.createImage();
imgadd = GifAdd.createImage();
imgRemove = GifRemove.createImage();
imgUpdate = updateImgDescriptor.createImage();
imgApply = imageApply.createImage();
imgClear = GifDelete.createImage();
imgOpenDirectory = imageSample.createImage();
imgOpenFiles = imageFiles.createImage();
logger = FableLogger.getLogger();
// GS 1.3.1
controller.addPropertyChangeListener(this);
listOfSamples = controller.getSamples();
//
sortListener = new Listener() {
// Function called to move items while sorting
public void handleEvent(Event e) {
TableColumn sortColumn = fileTable.getSortColumn();
TableColumn currentColumn = (TableColumn) e.widget;
// determine new sort column and direction
int dir = fileTable.getSortDirection();
if (sortColumn == currentColumn) {
dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
} else {
fileTable.setSortColumn(currentColumn);
dir = SWT.DOWN;
}
// sort the data based on column and direction
TableColumn[] cols = fileTable.getColumns();
// TableItem[] items = fileTable.getItems();
final TableColumn column = ((TableColumn) e.widget);
columnSelected = (TableColumn) e.widget;
//
boolean columnIndexFound = false;
for (int n = 0; !columnIndexFound && cols != null
&& n < cols.length; n++) {
if (columnSelected == cols[n]) {
columnIndexSelected = n;
columnIndexFound = true;
}
}
// Collator collator =
// Collator.getInstance(Locale.getDefault());
currentSample.setComparator((String) columnSelected
.getData("key"), dir);
// PART FOR REMOVE COLUMN : delete the firsts two rows is not
// allowed
if (columnIndexSelected > 1) {
removeKeyInTable.setEnabled(true);
} else {
removeKeyInTable.setEnabled(false);
}
final int dirForThread = dir;
new Thread(new Runnable() {
public void run() {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
sort = currentSample.getSortedFiles();
populateFileTable();
// update data displayed in table
fileTable.setSortDirection(dirForThread);
fileTable.setSortColumn(column);
// Color rows
for (int n = 0; n < fileTable.getItemCount(); n++) {
fileTable.getItem(n).setBackground(
(n % 2 == 0) ? Display.getCurrent()
.getSystemColor(
SWT.COLOR_WHITE)
: light_blue);
}
}
});
}
});
}
};
preferencesListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(
FabioPreferenceConstants.FILE_TYPE)) {
regularExpressionForExtension = Activator.getDefault()
.getPreferenceStore().getString(
FabioPreferenceConstants.FILE_TYPE);
} else if (event.getProperty().equals(
FabioPreferenceConstants.STEM_NAME)) {
filter = Activator.getDefault().getPreferenceStore()
.getString(FabioPreferenceConstants.STEM_NAME);
textFilter.set_Text(filter);
setFilter();
}
}
};
}
/**
* Init attributes.
*
* @param parent
*/
private void initValues(Composite parent) {
display = Display.getCurrent();
view = this;
// view.setContentDescription("Load images for your data analysis here");
// view.setPartName("Sample chooser");
// init with most common standard used
titles.add(0, "#");
titles.add(1, "Name");
/**
* Init values with
*/
Activator.getDefault().getPreferenceStore().addPropertyChangeListener(
preferencesListener);
regularExpressionForExtension = Activator.getDefault()
.getPreferenceStore().getString(
FabioPreferenceConstants.FILE_TYPE);
filter = Activator.getDefault().getPreferenceStore().getString(
FabioPreferenceConstants.STEM_NAME);
}
@Override
public void createPartControl(Composite parent) {
initValues(parent);
GridLayout gdL = new GridLayout(1, true);
parent.setLayout(gdL);
createContextMenu();
createTabListe(parent);
makeActions();
contributeToActionBars();
}
/**
* Create the context menu.
*/
private void createContextMenu() {
// Create menu manager.
contextMenuMgr = new MenuManager();
contextMenuMgr.setRemoveAllWhenShown(true);
contextMenuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager mgr) {
fillLocalMenu(mgr);
}
});
// Register menu for extension.
// getSite().registerContextMenu(menuMgr,
// canvasComposite.getAccessible());
}
/**
* Fill the local menus. Used for the local view menu and the context menu
* so they will be the same.
*
* @param manager
*/
private void fillLocalMenu(IMenuManager manager) {
manager.add(new Action("Remove Selected Files", GifDelete) {
@Override
public void run() {
removeSelectedFiles();
}
@Override
public void setToolTipText(String toolTipText) {
super.setToolTipText("Remove the selected file from the table");
}
@Override
public void setImageDescriptor(ImageDescriptor newImage) {
super.setImageDescriptor(GifDelete);
}
});
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
/**
*
* 3 oct. 07
*
* @author G. Suchet
* @param parent
* @description create Sample table and its files table seperated by a sash
*/
private void createTabListe(Composite parent) {
final int COLUMN_NUMBER = 5;
ScrolledComposite scrolledComposite = new ScrolledComposite(parent,
SWT.V_SCROLL | SWT.H_SCROLL);
Composite grpListe = new Composite(scrolledComposite, SWT.None);
scrolledComposite.setContent(grpListe);
scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
true, 1, 1));
grpListe.setLayout(new GridLayout(COLUMN_NUMBER, false));
grpListe.setLayoutData(new GridData());
grpListe.pack();
Composite container = new Composite(grpListe, SWT.NONE);
container.setLayout(new GridLayout(4, false));
container
.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
((GridData) container.getLayoutData()).horizontalSpan = COLUMN_NUMBER;
Label lblKey = new Label(container, SWT.NONE);
lblKey.setText("Header Key");
listKeys = new List(container, SWT.BORDER | SWT.V_SCROLL);
GridData gdlist = new GridData(SWT.FILL, GridData.CENTER, true, false);
gdlist.verticalSpan = 1;
gdlist.horizontalSpan = 1;
int listHeigth = listKeys.getItemHeight() * 2;
Rectangle trim = listKeys.computeTrim(0, 0, 0, listHeigth);
gdlist.heightHint = trim.height;
listKeys.setLayoutData(gdlist);
listKeys.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent e) {
addColumn();
}
});
listKeys.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) {
addColumn();
}
}
});
addKeyInTab = new Button(container, SWT.PUSH);
addKeyInTab.setImage(imgadd);
// addKeyInTab.setLayoutData(new GridData( SWT.FILL, GridData.CENTER,
// false, false));
addKeyInTab.setToolTipText("Add selected key in table");
addKeyInTab.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
addColumn();
}
});
addKeyInTab.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (imgadd != null) {
imgadd.dispose();
}
}
});
removeKeyInTable = new Button(container, SWT.PUSH);
removeKeyInTable.setImage(imgRemove);
// removeKeyInTable.setLayoutData(new GridData( SWT.FILL,
// GridData.CENTER, false, false));
removeKeyInTable.setToolTipText("Remove selected column");
removeKeyInTable.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
removeColumn();
}
});
removeKeyInTable.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (imgRemove != null && !imgRemove.isDisposed()) {
imgRemove.dispose();
}
}
});
// Init : remove key is disabled because no column has been selected yet
removeKeyInTable.setEnabled(false);
//
// 07/22/2008 : add a textfilter
GridData gdForFiltering = new GridData(SWT.FILL, GridData.CENTER, true,
false);
gdForFiltering.horizontalSpan = 1;
textFilter = new StringText(grpListe, SWT.NONE, "Filter");
textFilter.getTextField().addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) {
String s = ((Text) e.widget).getText();
filter = s;
setFilter();
}
}
});
textFilter.setLayoutData(gdForFiltering);
textFilter.set_Text(filter);
btnApplyfilter = new Button(grpListe, SWT.PUSH);
btnApplyfilter.setImage(imgApply);
btnApplyfilter.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (imgApply != null && !imgApply.isDisposed()) {
imgApply.dispose();
}
}
});
btnApplyfilter.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
filter = textFilter.getText();
setFilter();
}
});
GridData gdforApplyFilter = new GridData(SWT.FILL, SWT.CENTER, false,
false);
btnApplyfilter.setLayoutData(gdforApplyFilter);
btnClearfilter = new Button(grpListe, SWT.PUSH);
btnClearfilter.setImage(imgClear);
btnClearfilter.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (imgClear != null && !imgClear.isDisposed()) {
imgClear.dispose();
}
}
});
btnClearfilter.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
filter = "";
textFilter.set_Text("");
setFilter();
}
});
GridData gdforClearFilter = new GridData(SWT.FILL, SWT.CENTER, false,
false);
btnClearfilter.setLayoutData(gdforClearFilter);
labelTextFilter = new Text(grpListe, SWT.NO_BACKGROUND | SWT.READ_ONLY
| SWT.NO_FOCUS);
labelTextFilter.setEditable(false);
labelTextFilter.setBackground(Display.getDefault().getSystemColor(
SWT.COLOR_WIDGET_BACKGROUND));
labelTextFilter.setForeground(Display.getDefault().getSystemColor(
SWT.COLOR_DARK_YELLOW));
GridData gdForFilteringTextlabel = new GridData(SWT.FILL, SWT.CENTER,
true, false);
labelTextFilter.setLayoutData(gdForFilteringTextlabel);
/*
* btnApplyForAll = new Button(grpListe, SWT.CHECK);
* btnApplyForAll.setText("All");
* btnApplyForAll.setToolTipText("Apply filter for all directories");
* btnApplyForAll.addSelectionListener(new SelectionAdapter(){
*
* @Override public void widgetSelected(SelectionEvent e) {
* applyFilter=((Button)e.widget).getSelection();
* filter=textFilter.getText();
*
* setFilter();
*
* } }); applyFilter=btnApplyForAll.getSelection(); GridData
* gdforApplyck = new GridData( SWT.FILL, SWT.CENTER, false, false);
* btnApplyForAll.setLayoutData(gdforApplyck);
*
* if(btnApplyForAll.getSelection()){
* btnClearfilter.setToolTipText("Clear filter for all directories"); }
* else{ String name=""; if(currentSample != null){ name =
* currentSample.get_name();
* btnClearfilter.setToolTipText("Clear filter for selected directory: "
* + name);
*
* } }
*/
sash = new SashForm(grpListe, SWT.HORIZONTAL);
GridData gdExplorer = new GridData(GridData.FILL, GridData.FILL, true,
true);
gdExplorer.horizontalAlignment = GridData.FILL;
gdExplorer.verticalAlignment = GridData.FILL;
gdExplorer.horizontalSpan = COLUMN_NUMBER;
sash.setLayoutData(gdExplorer);
GridData gdTree = new GridData(SWT.FILL, SWT.FILL, true, true);
gdTree.horizontalSpan = 1;
sampleTable = new TableViewer(sash, SWT.BORDER);
sampleTable.setContentProvider(new SampleTableContentProvider());
sampleTable.setLabelProvider(new SampleTablelabelProvider());
sampleTable.getTable().setHeaderVisible(true);
sampleTable.getTable().setLinesVisible(true);
// populate table files with sample files
sampleTable.getTable().addMouseListener(new MouseAdapter() {
public void mouseDown(MouseEvent e) {
if (e.button == 3) {
Menu menu = new Menu(Display.getCurrent().getActiveShell(),
SWT.POP_UP);
MenuItem mitemAdd = new MenuItem(menu, SWT.PUSH);
final Image img = GifDelete.createImage();
mitemAdd.setImage(img);
mitemAdd.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (img != null) {
img.dispose();
}
}
});
mitemAdd.setText("Remove from list");
mitemAdd.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
removeSelectedSample(currentSample);
}
});
menu.setVisible(true);
while (!menu.isDisposed() && menu.isVisible()) {
if (!Display.getCurrent().readAndDispatch())
Display.getCurrent().sleep();
}
menu.dispose();
}
}
});
sampleTable.getTable().addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
TableItem[] ti = ((Table) e.widget).getSelection();
if (ti != null && ti.length > 0) {
currentSample = (Sample) ti[0].getData();
btnUpdate.setEnabled(currentSample.isDirectory());
setCurrentSample();
} else {
currentSample = null;
}
}
});
createFileTable();
Composite tablebtnCont = new Composite(grpListe, SWT.NONE);
tablebtnCont.setLayout(new GridLayout(3, false));
tablebtnCont.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
false));
((GridData) tablebtnCont.getLayoutData()).horizontalSpan = COLUMN_NUMBER;
/*
* do we need these buttons here - they are already actions of the view
* bar ?
*/
/*
* btnOpenfiles = new Button(tablebtnCont, SWT.PUSH );
* btnOpenfiles.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
* false,1, 1)); btnOpenfiles.setImage(imgOpenFiles);
* btnOpenfiles.setText("Open files");
* btnOpenfiles.addDisposeListener(new DisposeListener(){ public void
* widgetDisposed(DisposeEvent e) { if(imgOpenFiles!= null &&
* !imgOpenFiles.isDisposed()){ imgOpenFiles.dispose(); }
*
* }}); btnOpenfiles.setToolTipText("Open one or more files");
* btnOpenfiles.addSelectionListener(new SelectionAdapter( ){
*
* @Override public void widgetSelected(SelectionEvent e) { new
* OpenFilesAction().run(); }
*
* } ); btnOpendirectory = new Button(tablebtnCont, SWT.PUSH);
* btnOpendirectory.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
* false, false,1, 1));
*
* btnOpendirectory.setImage(imgOpenDirectory);
* btnOpendirectory.setText("Open directory");
* btnOpendirectory.setToolTipText("Open a directory");
* btnOpendirectory.addDisposeListener(new DisposeListener(){
*
* public void widgetDisposed(DisposeEvent e) { if(imgOpenDirectory !=
* null && !imgOpenDirectory.isDisposed()){ imgOpenDirectory.dispose();
* }
*
* }
*
* }); btnOpendirectory.addSelectionListener(new SelectionAdapter(){
*
* @Override public void widgetSelected(SelectionEvent e) { new
* OpensampleAction().run(); } });
*/
btnRemoveSelect = new Button(tablebtnCont, SWT.PUSH);
btnRemoveSelect.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
false));
btnRemoveSelect.setImage(imgDelete);
btnRemoveSelect.setText("Remove");
btnRemoveSelect.setToolTipText("Remove selection from the table");
btnRemoveSelect.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (sampleTable.getTable().getSelectionCount() > 0) {
removeSelectedSample(currentSample);
} else if (fileTable.getSelectionCount() > 0) {
removeSelectedFiles();
}
}
});
btnRemoveSelect.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (imgDelete != null && !imgDelete.isDisposed()) {
imgDelete.dispose();
}
}
});
// Add update button
btnUpdate = new Button(tablebtnCont, SWT.PUSH);
btnUpdate
.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
btnUpdate.setImage(imgUpdate);
btnUpdate.setText("Refresh");
btnUpdate.setToolTipText("Refresh files for directory");
btnUpdate.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (currentSample != null) {
updateDirectory();
}
}
});
btnUpdate.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (imgUpdate != null && !imgUpdate.isDisposed()) {
imgUpdate.dispose();
}
}
});
btnAutoUpdate = new Button(tablebtnCont, SWT.CHECK);
btnAutoUpdate.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false,
false));
btnAutoUpdate.setText("Auto Refresh");
btnAutoUpdate
.setToolTipText("Automatically refresh files for directory");
btnAutoUpdate.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
autoUpdate = !autoUpdate;
if (autoUpdate) {
autoUpdateJobStart();
}
}
});
sash.setWeights(new int[] { 20, 50 });
scrolledComposite.setMinHeight(Display.getDefault().getPrimaryMonitor()
.getBounds().height);
scrolledComposite.setMinWidth(Display.getDefault().getPrimaryMonitor()
.getBounds().width);
scrolledComposite.setExpandVertical(true);
scrolledComposite.setExpandHorizontal(true);
scrolledComposite.setMinSize(grpListe.computeSize(SWT.DEFAULT,
SWT.DEFAULT));
// Init filter
clearFilter();
}
/**
* This function is called when a file is selected in a table or when
* selection is set for fileTable (after removing files for example);
*/
private void fileSelecionInTable() {
int index = fileTable.getSelectionIndex();
if (index >= 0) {
TableItem item = fileTable.getItem(index);
f_fabio = (FabioFile) item.getData();// current selected fabio file
if (currentSample != null && currentSample.hasFile()) {
int currentIndex = currentSample.getFilteredfiles().indexOf(
f_fabio);
if (currentIndex >= 0) {
controller.setCurrentFileIndex(currentIndex);
// New request from John 02/07/2008 : load keys for selected
// files
f_fabio = currentSample.getCurrentFabioFile();
populateCombo();
}
// Unselect sample from sample table since we have only
// one button to remove files or sample
sampleTable.getTable().setSelection(-1);
}
}
}
/**
* Add file table on the right side of the sample table
*/
private void createFileTable() {
fileTable = new Table(sash, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION
| SWT.VIRTUAL);
fileTable.setLinesVisible(true);
fileTable.setHeaderVisible(true);
fileTableViewer = new TableViewer(fileTable, SWT.BORDER);
// Create menu.
Menu menu = contextMenuMgr.createContextMenu(fileTable.getAccessible()
.getControl());
fileTable.getAccessible().getControl().setMenu(menu);
getSite().registerContextMenu(contextMenuMgr, fileTableViewer);
createDragSource();
fileTable.addListener(SWT.SetData, new Listener() {
public void handleEvent(Event event) {
TableItem item = (TableItem) event.item;
int i = event.index;
try {
FabioFile fabio = ((FabioFile) sort.elementAt(i));
// To avoid reading header while loading
item.setText(0, "" + i);
item.setText(1, fabio.getFileName());
item.setData(fabio);
for (int j = 2; j < titles.size(); j++) {
try {
String txt = fabio.getValue(titles.elementAt(j));
item.setText(j, txt);
} catch (FabioFileException e) {
item.setText(j, "NA");
logger.error("Error while adding files in table."
+ "" + e.getMessage());
}
}
item.setBackground((i % 2 == 0) ? Display.getCurrent()
.getSystemColor(SWT.COLOR_WHITE) : light_blue);
} catch (IndexOutOfBoundsException ie) {
logger.error("Error while adding files in table."
+ ie.getMessage());
}
}
});
fileTable.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
fileSelecionInTable();
}
});
initColumn();
}
/**
* Create a drag source for the file table. The data will be a FileTransfer
* with a String[] of the full names of the selected files. Note that when
* dragging to the Image Navigator you will be making a selection, that will
* itself cause the ImageView to update. The drag will actually cause this
* to happen twice, and so there isn't any utility in dragging to the Image
* Viewer, but it is an intuitive thing to do. Dragging elsewhere should
* work as normal.
*/
private void createDragSource() {
final DragSource source = new DragSource(fileTable, DND.DROP_COPY);
source.setTransfer(new Transfer[] { FileTransfer.getInstance() });
final DragSourceListener dragListener = new DragSourceListener() {
public void dragFinished(DragSourceEvent event) {
}
public void dragSetData(DragSourceEvent event) {
// Get the selected file names and return that array as the data
TableItem[] items = fileTable.getSelection();
if (items == null || items.length == 0) {
return;
}
int nItems = items.length;
String[] fileNames = new String[nItems];
TableItem item = null;
FabioFile fabioFile = null;
for (int i = 0; i < nItems; i++) {
item = items[i];
fabioFile = (FabioFile) item.getData();
if (fabioFile != null
&& fabioFile.getFullFilename() != null) {
fileNames[i] = fabioFile.getFullFilename();
} else {
// Shouldn't happen
fileNames[i] = "Image Navigator Drag Error";
}
}
event.data = fileNames;
}
public void dragStart(DragSourceEvent event) {
event.doit = fileTable.getSelection().length > 0;
}
};
source.addDragListener(dragListener);
source.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
source.removeDragListener(dragListener);
}
});
}
/**
* Get the list of selected files in the sample navigator's file table and
* return the indices corresponding to their position in the vector of
* FabioFiles.
*
* @return - list of file indices as an array of int
*/
public Vector<Integer> getSelectedFilesIndex() {
final Vector<Integer> selectedFilesIndex = new Vector<Integer>();
Display.getDefault().syncExec(new Runnable() {
public void run() {
TableItem[] items = fileTable.getSelection();
for (int i = 0; i < items.length; i++) {
selectedFilesIndex.addElement(Integer.parseInt(items[i]
.getText()));
}
}
});
return selectedFilesIndex;
}
private void contributeToActionBars() {
IActionBars bars = getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
fillLocalToolBar(bars.getToolBarManager());
}
private void fillLocalPullDown(IMenuManager manager) {
manager.add(actionOpensample);
manager.add(actionOpenFiles);
}
private void fillLocalToolBar(IToolBarManager manager) {
manager.add(actionOpensample);
manager.add(actionOpenFiles);
}
private void makeActions() {
actionOpenFiles = new OpenFilesAction();
actionOpensample = new OpensampleAction();
actionOpensample.setText("Open Directory");
actionOpensample.setToolTipText("Select a directory to load.");
actionOpensample.setImageDescriptor(imageSample);
actionOpenFiles.setText("Open Files");
actionOpenFiles.setToolTipText("Select image file(s) to load.");
actionOpenFiles.setImageDescriptor(imageFiles);
// slice1DAction = new Slice1DAction("1D Slice");
// // slice1DAction.init(iv);
// slice1DAction
// .setToolTipText("Make a new 2D image by stacking the zoomed line of the selected images");
}
/**
*
*/
private void setCurrentSample() {
// Put current filterto current Sample if selected Sample has changed
if (!controller.getSamples().contains(currentSample)) {
controller.addSample(currentSample);
}
controller.setCurrentSample(currentSample);
// Show the files of the first element
if (sampleTable.getTable().getItemCount() > 0) {
// Since we have only one button to remove selection
// sampleTable.getTable().setSelection(sampleTable.getTable().getItem(i));
if (currentSample.hasFile()) {
sort = currentSample.getFilteredfiles();
updateFilterInfo();
}
if (sort.size() > 0) {
controller.setCurrentFileIndex(0);
f_fabio = currentSample.getCurrentFabioFile();
}
populateCombo();
populateFileTable();
}
}
/**
* This function is called to update the number of files displayed in
* comparison with the number of files that have been loaded.
*/
private void updateFilterInfo() {
if (currentSample != null) {
if (currentSample.getFilter().equals("")) {
clearFilter();
} else {
int total = currentSample.getFabioFiles().size();
int n = 0;
if (sort != null) {
n = sort.size();
}
labelTextFilter.setText(n + "/" + total + " files");
textFilter.set_Text(currentSample.getFilter());
}
}
}
/**
*
* 3 oct. 07
*
* @author G. Suchet
* @description remove selected column except the two firsts (#, Name)
*/
private void removeColumn() {
if (columnSelected != null
&& (columnIndexSelected > 1 && columnIndexSelected < fileTable
.getColumnCount())) {
columnSelected.dispose();
// titles.remove(columnIndexSelected);
titles.removeElementAt(columnIndexSelected);
for (int i = 0; i < titles.size()
&& !Activator.getDefault().getPreferenceStore().getBoolean(
FabioPreferenceConstants.FIX_COLUMN_SIZE); i++) {
fileTable.getColumn(i).pack();
}
}
}
/**
*
* 3 oct. 07
*
* @author G. Suchet
* @description remove selected column except the two firsts (#, Name)
*/
private void removeAllColumnsAdded() {
int j = 2;
while (fileTable.getColumnCount() > 2) {
fileTable.getColumn(j).dispose();
titles.removeElementAt(j);
}
for (int i = 0; i < titles.size()
&& !Activator.getDefault().getPreferenceStore().getBoolean(
FabioPreferenceConstants.FIX_COLUMN_SIZE); i++) {
fileTable.getColumn(i).pack();
}
}
private void addColumn() {
int index = listKeys.getSelectionIndex();
if (index == -1) {
index = 0;
}
String newHeader = (listKeys.getItem(index));
titles.add(newHeader);
TableColumn column = new TableColumn(fileTable, fileTable.getStyle());
column.setText(titles.lastElement());
column.addListener(SWT.Selection, sortListener);
column.setData("key", newHeader);
column.setData("index", titles.size() - 1);
Job job_addColumn = new Job("Wait while getting " + newHeader
+ " stored in file header") {
protected IStatus run(final IProgressMonitor monitor) {
monitor.beginTask("get " + titles.lastElement(), currentSample
.getFiles().length);
if (monitor.isCanceled()) {
monitor.done();
return Status.CANCEL_STATUS;
}
display.syncExec(new Runnable() {
// @Override
public void run() {
// int col = titles.size() - 1;
// TableItem item;
// if (fileTable.getItemCount() > titles.size()) {
// item = fileTable.getItem(titles.size());
// } else {
// item = new TableItem(fileTable, SWT.NONE);
// }
setSelectedFiles(currentSample.getFiles());
}
});
display.syncExec(new Runnable() {
public void run() {
for (int i = 0; i < titles.size()
&& !Activator
.getDefault()
.getPreferenceStore()
.getBoolean(
FabioPreferenceConstants.FIX_COLUMN_SIZE); i++) {
fileTable.getColumn(i).pack();
}
}
});
monitor.worked(100);
monitor.done();
return Status.OK_STATUS;
}
};
job_addColumn.setUser(true);
job_addColumn.schedule();
}
/**
*
* 3 oct. 07
*
* @author G. Suchet
*/
private void initColumn() {
for (int i = 0; i < titles.size(); i++) {
int style = SWT.None;
TableColumn column = new TableColumn(fileTable, style);
column.setText(titles.elementAt(i));
column.addListener(SWT.Selection, sortListener);
column.setData("key", titles.elementAt(i));
column.setData("index", i);
}
new TableItem(fileTable, SWT.NONE);
clearFiles();
for (int i = 0; i < titles.size(); i++) {
// please pack the two first columns
fileTable.getColumn(i).pack();
}
fileTable.setSortColumn(fileTable.getColumn(1));
fileTable.setSortDirection(SWT.DOWN);
}
/**
*
* 16 Jan. 08
*
* @author G. Suchet
* @description fill list with header keys with a progress dialog
*/
private void populateCombo() {
if (currentSample.getFilteredfiles().size() > 0) {
listKeys.setEnabled(true);
addKeyInTab.setEnabled(true);
display.asyncExec(new Runnable() {
public void run() {
try {
String[] list = controller.getKeys();
listKeys.removeAll();
listKeys.setData("HEADER_KEYS", list);
for (int i = 0; i < list.length; i++) {
listKeys.add(list[i]);
}
listKeys.select(0);
} catch (SampleException e) {
logger.error(e.getMessage());
}
}
});
} else // Sample has no files
{
listKeys.removeAll();
listKeys.setEnabled(false);
addKeyInTab.setEnabled(false);
}
}
/**
* return default processing view
*
* @return default processing view
*/
public static SampleNavigatorView getDefault() {
return view;
}
@Override
public void setFocus() {
}
/**
*@description populate sample tree with selected samples
*/
private void populateTreeSample() {
sampleTable.setInput(new Experiment(listOfSamples));
// fireSamplesChoosen();
}
/**
* update the list of selected files to display
*
* @param String
* [] newFiles - list of selected files
*/
public void setSelectedFiles(String[] newFiles) {
if (newFiles != null && newFiles.length > 0) {
populateFileTable();
}
}
/**
* Update sample with this filter.
*/
private void setFilter() {
if (currentSample != null) {
if (applyFilter) {
Vector<Sample> directories = controller.getSamples();
for (int i = 0; i < directories.size(); i++) {
directories.elementAt(i).setFilter(filter);
}
}
currentSample.setFilter(filter);
setCurrentSample();
}
}
/**
*
* 19 sept. 07
*
* @author G. Suchet
* @param listener
* @description store property change listener
*/
public void addPropertyChangeListener(IPropertyChangeListener listener) {
array.add(listener);
}
/**
*
* 19 sept. 07
*
* @author G. Suchet
* @param listener
*/
public void removePropertyChangeListener(IPropertyChangeListener listener) {
array.remove(listener);
}
/**
* @description update the list of files in the processing table
*
* @param String
* [] newFiles - list of files to display
*/
private void populateFileTable() {
fileTable.clearAll();
int nbItemsForFiles = currentSample.getFilteredfiles().size();
if (currentSample != null && currentSample.hasFile()) {
fileTable.setItemCount(nbItemsForFiles);
// table.setSelection(0);
} else {
fileTable.setItemCount(0);
}
for (int i = 0; i < fileTable.getColumnCount()
&& !Activator.getDefault().getPreferenceStore().getBoolean(
FabioPreferenceConstants.FIX_COLUMN_SIZE); i++) {
fileTable.getColumn(i).pack();
}
}
/**
* clear the table of files to process
*
*/
public void clearFiles() {
display.syncExec(new Runnable() {
public void run() {
TableItem item;
fileTable.removeAll();
if (fileTable.getItemCount() > 0) {
item = fileTable.getItem(0);
} else {
item = new TableItem(fileTable, SWT.NONE);
}
item.setText(0, "0");
}
});
}
/**
*
*/
private void resetExperimentInfos() {
// stextSampleDirectory.set_Text("");
// currentSample=null;
// stextSample.setText("");
// stextExperiment.setText("");
resetCombo();
removeAllColumnsAdded();
}
/**
*
*/
private void resetCombo() {
listKeys.removeAll();
}
/**
*
* @param s
* selected sample
*/
private void removeSelectedSample(Sample s) {
if (s != null) {
int i = listOfSamples.indexOf(s);//
controller.removeSample(s);
// int i=listOfSamples.size() > 0?listOfSamples.size()-1 :0;
if (i >= listOfSamples.size()) {
i = listOfSamples.size() - 1 >= 0 ? listOfSamples.size() - 1
: 0;
}
if (listOfSamples != null && listOfSamples.size() > 0) {
currentSample = listOfSamples.elementAt(i);
sampleTable.getTable().setSelection(i);
} else {
currentSample = null;
clearAll();
}
populateTreeSample();
if (currentSample != null) {
setCurrentSample();
} else {
clearFilter();
}
}
}
private void clearFilter() {
labelTextFilter.setText("no filter");
textFilter.set_Text("");
}
/**
* @Description clear selected files to process. Called when remove button
* is pushed Off line mode
*
*/
private void removeSelectedFiles() {
/*
* this is not compatible with auto update therefore first switch
* autoUpdate off
*/
if (autoUpdate) {
autoUpdateJob.cancel();
autoUpdate = false;
return;
}
display.syncExec(new Runnable() {
public void run() {
TableItem[] itemSelected = fileTable.getSelection();
if (itemSelected.length > 0) {
int firstSelection = fileTable.indexOf(itemSelected[0]);
for (int sel = 0; sel < itemSelected.length; sel++) {
currentSample
.removeFabioFile((FabioFile) itemSelected[sel]
.getData());
}
// update sort
sort = currentSample.getFilteredfiles();
// update filter label text
labelTextFilter.setText("");
populateFileTable();
int nItems = fileTable.getItemCount();
if (nItems > firstSelection) {
fileTable.setSelection(firstSelection);
fileSelecionInTable();
} else if (nItems > 0) {
fileTable.setSelection(nItems - 1);
fileSelecionInTable();
}
if (currentSample.getFabioFiles().size() == 0) {
clearFiles();
removeSelectedSample(currentSample);
resetExperimentInfos();
}
updateFilterInfo();
}
}
});
}
/**
* @description clear all informations when user switch online-offline mode
*/
private void clearAll() {
if (listOfSamples != null) {
listOfSamples.removeAllElements();
}
sampleTable.getTable().removeAll();
sampleTable.getTable().clearAll();
fileTable.removeAll();
fileTable.clearAll();
resetExperimentInfos();
}
/**
*
* 23 oct. 07
*
* @author G. Suchet
* @param dir
* @description load entire sample directory. Files loaded in the directory
* have sample_name (getFilesByEntireRegex)
*/
public File[] loadSample(String dir) {
File[] rFile = null;
if (dir != null && !dir.equals("")) {
/*
* String[] split=dir.split("[\\\\/]"); if(split.length >1){
* experimentName=split[split.length-2];
* sampleName=split[split.length-1]; }else if(split.length==1){
* sampleName=split[split.length-1]; experimentName="NA"; }
*/
initDirectoryName(dir);
rFile = getFiles(dir);
}
return rFile;
}
/**
* This function get the name of the directory and its parent.
*/
private void initDirectoryName(String dir) {
if (dir != null) {
File fileObj = new File(dir);
if (fileObj != null) {
if (fileObj.isDirectory()) {
sampleName = fileObj.getName();
String parent = fileObj.getParent();
if (parent != null) {
experimentName = new File(parent).getName();
}
}
}
}
}
/**
* This function returns a table of files in the directory with the
* extension fixed in the preference.
* <p>
* Condition: directory musn't be null.
* <p>
* This function is called for the first time in addDirectory and when user
* wants to update a sample if new files have been added (for example during
* an experiment on line).
*/
private File[] getFiles(String dir) {
File[] rFile = null;
if (regularExpressionForExtension.toLowerCase().contains("bruker")) {
// Pattern p = Pattern.compile("\\.*bruker\\.*",
// Pattern.CASE_INSENSITIVE);
Pattern p = Pattern.compile("bruker", Pattern.CASE_INSENSITIVE);
p.matcher(regularExpressionForExtension).matches();
regularExpressionForExtension = p.matcher(
regularExpressionForExtension)
.replaceAll("\\\\\\.\\\\\\d+");
}
/*
* AG : removed the dot in the expression which forces the filter to be
* after a dot this covers the Claudio case where file names have not
* dot in them but end in ccd
*/
// String expression = ".+\\.(" + regularExpressionForExtension + ")";
String expression = ".+(" + regularExpressionForExtension + ")";
rFile = fable.framework.toolbox.ToolBox.getFilesByEntireRegex(dir,
expression, true);
// Sort (Important to sort for peakSearch)
ToolBox.quicksort(rFile, 0, rFile.length);
return rFile;
}
public String getExperimentName() {
return experimentName;
}
public void setExperimentName(String experimentName) {
this.experimentName = experimentName;
}
public String getSampleName() {
return sampleName;
}
public void setSampleName(String sampleName) {
this.sampleName = sampleName;
}
public void setExperimentAndSampleName(String directory) {
String[] split = directory.split("[\\\\/]");
int len = split.length;
if (split != null) {
switch (len) {
case 0:
experimentName = directory;
sampleName = directory;
break;
case 1:
experimentName = split[0];
sampleName = split[0];
break;
default:
experimentName = split[len - 2];
sampleName = split[len - 1];
break;
}
} else {
experimentName = directory;
sampleName = directory;
}
}
/************************************ REPLACE FILEANDDIRECTORYDIALOG *****************************************/
public void addFiles(final String[] files, final String directory) {
setExperimentAndSampleName(directory);
job = new Job("Loading sample " + sampleName) {
boolean bAdded;
@Override
protected IStatus run(final IProgressMonitor monitor) {
job_status = Status.OK_STATUS;
setInitialDirectory(directory);
if (listOfSamples == null) {
listOfSamples = new Vector<Sample>();
}
for (int i = 0; i < files.length; i++) {
files[i] = directory + System.getProperty("file.separator")
+ files[i];
}
initDirectoryName(directory);
/*
* if(files.length>0){ final String firstFile = files[0];
* display.syncExec(new Runnable(){ public void run() { try {
* FabioFile f= new FabioFile(firstFile);
* sampleName=f.getStem(); } catch (FabioFileException e) {
* job_status=Status.CANCEL_STATUS;
* //System.out.println("Fable can't load file: " + firstFile
* +". " + e.getMessage());
* logger.error("Fable can't load file: " + firstFile +". " +
* e.getMessage()); }};
*
*
* }); }
*/
if (job_status == Status.OK_STATUS) {
final Sample spl = new Sample("files selected", sampleName,
directory);
spl.setDirectory(false);
controller.addSample(spl);
monitor.beginTask(sampleName, files.length);
if (monitor.isCanceled()) {
listOfSamples.remove(spl);
return Status.CANCEL_STATUS;
}
for (int i = 0; i < files.length; i++) {
final int j = i;
display.syncExec(new Runnable() {
public void run() {
try {
bAdded = spl.addFabioFile(new FabioFile(
files[j]));
if (monitor.isCanceled()) {
listOfSamples.remove(spl);
job_status = Status.CANCEL_STATUS;
}
} catch (FabioFileException e) {
logger.error(e.getMessage());
}
}
});
if (bAdded && job_status == Status.OK_STATUS) {
monitor.worked(1);
int percentage = (int) (((j + 1) * 100) / files.length);
monitor.subTask(percentage + "% done:" + files[j]
+ " added");
}
if (monitor.isCanceled()) {
listOfSamples.remove(spl);
return Status.CANCEL_STATUS;
}
}
if (sort == null) {
sort = new Vector<FabioFile>();
}
if (applyFilter) {
spl.setFilter(filter);
} else {
spl.setFilter("");
}
sort = spl.getFilteredfiles();
if (monitor.isCanceled()) {
listOfSamples.remove(spl);
return Status.CANCEL_STATUS;
}
listOfSamples.lastElement().setCurrentFilesFromFabio();
display.asyncExec(new Runnable() {
public void run() {
populateTreeSample();
}
});
if (monitor.isCanceled()) {
listOfSamples.remove(spl);
return Status.CANCEL_STATUS;
}
display.asyncExec(new Runnable() {
public void run() {
// setCurrentSample(listOfSamples.size()-1);
if (listOfSamples != null
&& listOfSamples.size() > 0) {
int index = listOfSamples.size() - 1;
currentSample = listOfSamples.elementAt(index);
sampleTable.getTable().setSelection(index);
// Disable update
btnUpdate.setEnabled(false);
} else {
currentSample = null;
}
setCurrentSample();
logger
.debug("Create a new Sample for "
+ directory);
}
});
monitor.done();
} else {
return job_status;
}
return Status.OK_STATUS;
}
};
job.setUser(true);
job.schedule();
job.addJobChangeListener(new JobChangeAdapter() {
public void done(IJobChangeEvent event) {
if (event.getResult().isOK())
logger.debug("Job completed successfully");
else
logger.error("Job did not complete successfully");
}
});
}
/**
* This function update a directory if new files have been added. New since
* 29/07/2008.
*/
public void updateDirectory() {
if (currentSample != null) {
try {
boolean indexLastFile = false;
/* is the last file in the list selected ? */
// logger.debug(" current index "+controller.getCurrentFileIndex()+" last index "+(controller
// .getCurrentsample().getFilteredfiles().size()-1));
if (controller.getCurrentFileIndex() >= controller
.getCurrentsample().getFilteredfiles().size() - 1)
indexLastFile = true;
File[] files = getFiles(currentSample.getDirectoryPath());
currentSample.updateFabioFiles(files);
if (currentSample.hasFile()) {
sort = currentSample.getFilteredfiles();
updateFilterInfo();
}
if (sort.size() > 0) {
f_fabio = currentSample.getCurrentFabioFile();
}
populateFileTable();
populateCombo();
/*
* if the last file was being displayed make sure this is still
* the case
*/
if (indexLastFile) {
controller.setCurrentFileIndex(controller
.getCurrentsample().getFilteredfiles().size());
fileTable.deselectAll();
fileTable.select(controller.getCurrentFileIndex());
fileTable.showSelection();
}
} catch (FabioFileException e) {
if (FableMessageConsole.console != null) {
FableMessageConsole.console
.displayError("An error occured while updating the directory");
logger
.debug("An error occured while updating the directory in sample chooser : "
+ e.getMessage());
}
}
}
}
/**
* This function is called when a directory is selected.
* <p>
* It gets all files with the type set in preferences to fill left table. If
* a filter exists and if the user has checked "set filter for all samples"
* a filter on the name is set.
*
* @param directory
*/
public void addDirectory(final String directory) {
setExperimentAndSampleName(directory);
job = new Job("Loading sample " + sampleName) {
@Override
protected IStatus run(final IProgressMonitor monitor) {
if (listOfSamples == null) {
listOfSamples = new Vector<Sample>();
}
job_status = Status.OK_STATUS;
final File[] filesInDir = loadSample(directory);
final Sample spl;
// reset sample name to get files_stem
setInitialDirectory(directory);
// initialDirData=Directory;
try {
spl = new Sample(experimentName, sampleName, directory,
filesInDir);
spl.setDirectory(true);
listOfSamples.add(spl);
monitor.beginTask(sampleName, filesInDir.length);
if (monitor.isCanceled()) {
listOfSamples.remove(spl);
return Status.CANCEL_STATUS;
}
currentSample = spl;
/*
* for (int i = 0; job_status == Status.OK_STATUS && i <
* filesInDir.length; i++) { final int j = i;
*
* display.syncExec(new Runnable() { public void run() { try
* { bAdded = currentSample .addFabioFile(filesInDir[j]); if
* (monitor.isCanceled()) { listOfSamples.remove(spl);
* currentSample = listOfSamples.lastElement(); job_status =
* Status.CANCEL_STATUS; } } catch (FabioFileException e) {
* job_status = Status.CANCEL_STATUS;
* logger.error(e.getMessage()); }
*
* } }); if (bAdded && job_status == Status.OK_STATUS) { int
* percentage = (int) (((j + 1) 100) / filesInDir.length);
* monitor.subTask(percentage + "% done:" + filesInDir[j] +
* " added"); } else if (job_status == Status.CANCEL_STATUS)
* { return job_status; }
*
* monitor.worked(1); if (monitor.isCanceled()) {
* listOfSamples.remove(currentSample); currentSample =
* listOfSamples.lastElement(); return Status.CANCEL_STATUS;
* }
*
* }
*/
if (sort == null) {
sort = new Vector<FabioFile>();
}
initSampleFilteredFiles(currentSample);
display.asyncExec(new Runnable() {
public void run() {
populateTreeSample();
}
});
if (monitor.isCanceled()) {
listOfSamples.remove(currentSample);
currentSample = listOfSamples.lastElement();
return Status.CANCEL_STATUS;
}
display.asyncExec(new Runnable() {
public void run() {
// setCurrentSample(listOfSamples.size()-1);
if (listOfSamples != null
&& listOfSamples.size() > 0) {
sampleTable.getTable().setSelection(
listOfSamples.indexOf(currentSample));
btnUpdate.setEnabled(true);
} else {
currentSample = null;
}
setCurrentSample();
logger
.debug("Create a new Sample for "
+ directory);
}
});
} catch (FabioFileException e) {
FableMessageConsole.console
.displayError("An error occured while adding directory : "
+ e.getMessage());
}
monitor.done();
return Status.OK_STATUS;
}
};
job.setUser(true);
job.schedule();
job.addJobChangeListener(new JobChangeAdapter() {
public void done(IJobChangeEvent event) {
if (event.getResult().isOK())
logger.debug("Job completed successfully");
else
logger.error("Job did not complete successfully");
}
});
}
/*
* private void buildSampleName(String filePath) { sampleName =
* filePath.substring(0, filePath.indexOf(".") - 4); }
*/
@Override
public void dispose() {
Activator.getDefault().getPreferenceStore()
.removePropertyChangeListener(preferencesListener);
super.dispose();
}
public static String getInitialDirectory() {
if (initialDirData == null) {
loadInitialDirectory();
}
return initialDirData;
}
public static void setInitialDirectory(String _initialDirectory) {
initialDirData = _initialDirectory;
saveInitialDirectory();
}
/**
* restore the initial directory from the directory.xml memento store
*/
public static void loadInitialDirectory() {
FileReader reader = null;
try {
reader = new FileReader(Activator.getDefault().getStateLocation()
.append("directory.xml").toFile());
XMLMemento memento = XMLMemento.createReadRoot(reader);
initialDirData = memento.getString(IVarKeys.INITIAL_DIRECTORY);
reader.close();
} catch (FileNotFoundException e) {
// ignore
} catch (WorkbenchException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* save the initial directory in the directory.xml memento store
*/
public static void saveInitialDirectory() {
FileWriter writer = null;
try {
XMLMemento memento = XMLMemento
.createWriteRoot(IVarKeys.INITIAL_DIRECTORY);
memento.putString(IVarKeys.INITIAL_DIRECTORY, initialDirData);
writer = new FileWriter(Activator.getDefault().getStateLocation()
.append("directory.xml").toFile());
memento.save(writer);
writer.close();
} catch (FileNotFoundException e) {
// ignore
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* To show required fields when a property change in another view (for
* instance, launched when preprocessor is launched without any files)
*
* @param event
*/
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(IVarKeys.SET_CURRENTFILE_EVENT)) {
// Get current selection index. If different from what has been
// set in the controller, please select it in table
if (fileTable.isDisposed()) {
return;
}
int index = fileTable.getSelectionIndex();
int selection = controller.getCurrentFileIndex();
if (currentSample != null
&& currentSample == controller.getCurrentsample()) {
f_fabio = currentSample.getCurrentFabioFile();
if (index != selection) {
int nbItems = fileTable.getItemCount();
if (nbItems > 0 && selection < nbItems) {
fileTable.setSelection(selection);
}
}
}
} else if (event.getProperty()
.equals(IVarKeys.UPDATE_SAMPLEFILES_EVENT)) {
this.sort = controller.getCurrentsample().getFilteredfiles();
}
}
public Sample getCurrentSample() {
return currentSample;
}
public Job getJob() {
return job;
}
public String getFilter() {
return filter;
}
public void setFilter(String filter) {
this.filter = filter;
}
/**
* This method init fabio filtered peaks file in Sample object.
*/
public void initSampleFilteredFiles(Sample sample) {
if (applyFilter) {
sample.setFilter(filter);
} else {
sample.setFilter("");
}
if (sort == null) {
sort = new Vector<FabioFile>();
}
sort = sample.getFilteredfiles();
sample.setCurrentFilesFromFabio();
}
public Vector<FabioFile> getSortedfiles() {
return sort;
}
/**
* Start a system job to update the current directory automatically every 10
* seconds This is useful for surveying directories on the beamline where
* files are constantly being created or where a data analysis program is
* producing new files
*
* @author andy
*/
private void autoUpdateJobStart() {
logger.info("start job to automatically update the directory");
autoUpdateJob = new Job(
"Automatically update files in current directory") {
protected IStatus run(final IProgressMonitor monitor) {
try {
if (autoUpdate && !monitor.isCanceled()) {
display.syncExec(new Runnable() {
// @Override
public void run() {
if (currentSample != null) {
logger.info("update directory");
updateDirectory();
}
}
});
}
if (!autoUpdate || monitor.isCanceled()) {
logger.info("cancel auto update job");
return Status.CANCEL_STATUS;
}
return Status.OK_STATUS;
} finally {
if (autoUpdate)
schedule(10000); // start again in 10 seconds
}
}
};
autoUpdateJob.setSystem(true);
autoUpdateJob.schedule();
}
}