/*
* 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.controller;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Vector;
import org.dawb.fabio.FabioFile;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.slf4j.Logger;
import fable.framework.logging.FableLogger;
import fable.framework.navigator.toolBox.IVarKeys;
import fable.python.Sample;
import fable.python.SampleException;
/**
* @author suchet
*
*/
public class SampleController implements IPropertyChangeListener {
/**
* class to register listeners for a specific sample name
*
* @author andy
*
*/
/*
* class SampleChangeListener { String sampleName; IPropertyChangeListener
* listener;
*
* SampleChangeListener(String _name, IPropertyChangeListener _listener) {
* sampleName = _name; listener = _listener; } }
*/
private Vector<Sample> vSample = new Vector<Sample>();
private static SampleController controller;
// private ISampleAdapter sampleListener;
private Sample sample; // active view ; current sample
private ArrayList<IPropertyChangeListener> myListeners;
private FabioFile currentFile;
private int currentIndex;
private Logger logger;
private SampleController() {
logger = FableLogger.getLogger((Class<?>) SampleController.class);
vSample = new Vector<Sample>();
myListeners = new ArrayList<IPropertyChangeListener>();
}
public String[] getKeys() throws SampleException {
String[] res = null;
if (sample != null) {
res = sample.getKeys();
}
return res;
}
public static SampleController getController() {
if (controller == null) {
controller = new SampleController();
}
return controller;
}
public void addSample(Sample s) {
vSample.add(s);
s.addPropertyChangeListener(this);
fireAddSample();
// 06/08/2008 for peakssptBy default, set this sample to current sample
// !
sample = s;
}
public void setCurrentSample(Sample s) {
sample = s;
// System.out.println("setCurrentSample(): set current sample to "+sample.get_name());
fireCurrentSample(vSample.indexOf(sample));
}
public Sample getCurrentsample() {
return sample;
}
public int getCurrentsampleIndex() {
int i = 0;
if (vSample != null && sample != null) {
i = vSample.indexOf(sample);
}
return i;
}
public int getNumberOfSample() {
return vSample.size();
}
public Sample getLastSample() {
return vSample.lastElement();
}
public void removeSample(int index) {
vSample.removeElementAt(index);
}
public void removeSample(Sample s) {
fireSampleRemoved(s);
vSample.remove(s);
}
public int getCurrentFileIndex() {
return currentIndex;
}
/**
*
* 23 oct. 07
*
* @author G. Suchet
* @param index
* edf index in sample
* @description set current file (selected in table for example)from current
* sample
*/
public void setCurrentFileIndex(int index) {
if (sample != null) {
if (index < 0)
index = 0;
else if (index >= sample.getFilteredfiles().size())
index = sample.getFilteredfiles().size() - 1;
currentIndex = index;
currentFile = sample.getFilteredfiles().elementAt(index);
sample.setCurrentFile(currentFile);
fireCurrentFileHasChanged();
}
}
/**
*
* 23 oct. 07
*
* @author G. Suchet
* @return currentFile if exists, else if one sample at least exists, return
* the first element of the last sample loaded
*/
public FabioFile getCurrentFile() {
if (currentFile != null) {
return currentFile;
} else if (vSample != null && vSample.size() > 0) {
Sample directory = vSample.lastElement();
if (directory.getFabioFiles() != null
&& directory.getFabioFiles().size() > 0) {
return directory.getFabioFiles().firstElement();
}
}
return null;
}
// --------- LISTENER -----------------------------------------------------
public void addPropertyChangeListener(IPropertyChangeListener listener) {
// DEBUG
// System.out.println("SampleController.addPropertyChangeListener: " +
// listener);
myListeners.add(listener);
}
public void removePropertyChangeListener(IPropertyChangeListener listener) {
// DEBUG
// System.out.println("SampleController.removePropertyChangeListener: "
// + listener);
myListeners.remove(listener);
}
public synchronized void fireCurrentFileHasChanged() {
logger.debug("fire event " + IVarKeys.SET_CURRENTFILE_EVENT);
for (Iterator<IPropertyChangeListener> iter = myListeners.iterator(); iter
.hasNext();) {
IPropertyChangeListener element = (IPropertyChangeListener) iter
.next();
// DEBUG
// System.out.println("SampleController.fireCurrentFileHasChanged: "
// + element);
element.propertyChange(new PropertyChangeEvent(this,
IVarKeys.SET_CURRENTFILE_EVENT, null, currentFile));
}
}
/**
* Send an event to all listeners to do something on the next image in a
* list if i > 0 or with the previous image if i < 0. See an example in
* <code>fable.peaksearch</code>.
*/
private void fireGetNext(int i) {
logger.debug("fire event "
+ fable.framework.internal.IVarKeys.NEXTIMAGE);
for (Iterator<IPropertyChangeListener> iter = myListeners.iterator(); iter
.hasNext();) {
IPropertyChangeListener element = (IPropertyChangeListener) iter
.next();
element.propertyChange(new PropertyChangeEvent(this,
fable.framework.internal.IVarKeys.NEXTIMAGE, null, i));
}
}
/**
* Send an event to all listeners to do something on the first image in a
* list. See an example in <code>fable.peaksearch</code>.
*/
private void fireGetFirst() {
for (Iterator<IPropertyChangeListener> iter = myListeners.iterator(); iter
.hasNext();) {
IPropertyChangeListener element = (IPropertyChangeListener) iter
.next();
element.propertyChange(new PropertyChangeEvent(this,
fable.framework.internal.IVarKeys.FIRSTIMAGE, null, null));
}
}
/**
* Send an event to all listeners to do something on the last image in a
* list. See an example in <code>fable.peaksearch</code>.
*/
private void fireGetLast() {
for (Iterator<IPropertyChangeListener> iter = myListeners.iterator(); iter
.hasNext();) {
IPropertyChangeListener element = (IPropertyChangeListener) iter
.next();
element.propertyChange(new PropertyChangeEvent(this,
fable.framework.internal.IVarKeys.LASTIMAGE, null, null));
}
}
public void fireSampleRemoved(Sample s) {
for (Iterator<IPropertyChangeListener> iter = myListeners.iterator(); iter
.hasNext();) {
IPropertyChangeListener element = (IPropertyChangeListener) iter
.next();
element.propertyChange(new PropertyChangeEvent(this,
IVarKeys.REMOVE_SAMPLE_EVENT, null, s));
}
}
public void fireCurrentSample(int index) {
for (Iterator<IPropertyChangeListener> iter = myListeners.iterator(); iter
.hasNext();) {
IPropertyChangeListener element = (IPropertyChangeListener) iter
.next();
element.propertyChange(new PropertyChangeEvent(this,
IVarKeys.CURRENT_SAMPLE_EVENT, null, index));
}
}//
public void fireAddSample() {
for (Iterator<IPropertyChangeListener> iter = myListeners.iterator(); iter
.hasNext();) {
IPropertyChangeListener element = (IPropertyChangeListener) iter
.next();
element.propertyChange(new PropertyChangeEvent(this,
IVarKeys.NEW_SAMPLE_EVENT, null, vSample.lastElement()));
}
}
public void fireUpdatePlot() {
for (Iterator<IPropertyChangeListener> iter = myListeners.iterator(); iter
.hasNext();) {
IPropertyChangeListener element = (IPropertyChangeListener) iter
.next();
element.propertyChange(new PropertyChangeEvent(this,
IVarKeys.UPDATE_PLOT_EVENT, null, null));
}
}
/**
* This event is sent if a sample has new files.
*/
public void fireUpdateFiles() {
for (Iterator<IPropertyChangeListener> iter = myListeners.iterator(); iter
.hasNext();) {
IPropertyChangeListener element = (IPropertyChangeListener) iter
.next();
element.propertyChange(new PropertyChangeEvent(this,
IVarKeys.UPDATE_SAMPLEFILES_EVENT, null, vSample
.lastElement()));
}
}
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals("updateHeaderValues")) {
fireUpdatePlot();
} else if (event.getProperty().equals(
fable.framework.internal.IVarKeys.UPDATEFILES_EVENT)) {
fireUpdateFiles();
}
}
public Vector<Sample> getSamples() {
return vSample;
}
/**
*
* @param i
* 1 to get next image or -1 to get previous image
*/
public void getNext(int i) {
fireGetNext(i);
}
/**
* Send an event to all <code>SampleController</code> listener to do
* something with the first image. See example in <code>PeaksSptView</code>.
*/
public void getFirstImage() {
fireGetFirst();
}
/**
* Send an event to all <code>SampleController</code> listener to do
* something with the last image. See example in <code>PeaksSptView</code>.
*/
public void getLastImage() {
fireGetLast();
}
}