package eu.jucy.gui.transferview;
import java.io.File;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import helpers.IObservable;
import helpers.SizeEnum;
import helpers.StatusObject;
import helpers.Observable.IObserver;
import logger.LoggerFactory;
import org.apache.log4j.Logger;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import eu.jucy.gui.ApplicationWorkbenchWindowAdvisor;
import eu.jucy.gui.GUIPI;
import eu.jucy.gui.Lang;
import eu.jucy.gui.UCView;
import eu.jucy.gui.itemhandler.CommandDoubleClickListener;
import eu.jucy.gui.itemhandler.OpenDirectoryHandler;
import eu.jucy.gui.transferview.TransferColumns.FilenameColumn;
import eu.jucy.gui.transferview.TransferColumns.HubColumn;
import eu.jucy.gui.transferview.TransferColumns.IPColumn;
import eu.jucy.gui.transferview.TransferColumns.SizeColumn;
import eu.jucy.gui.transferview.TransferColumns.SpeedColumn;
import eu.jucy.gui.transferview.TransferColumns.StatusColumn;
import eu.jucy.gui.transferview.TransferColumns.TimeLeftColumn;
import eu.jucy.gui.transferview.TransferColumns.UserColumn;
import uc.ConnectionHandler;
import uc.IUser;
import uc.files.transfer.AbstractFileTransfer;
import uc.protocols.client.ClientProtocol;
import uc.protocols.client.ClientProtocolStateMachine;
import uihelpers.DelayedTableUpdater;
import uihelpers.SUIJob;
import uihelpers.TableViewerAdministrator;
import uihelpers.ToolTipProvider;
public class TransfersView extends UCView implements IObserver<StatusObject> {
public static Logger logger = LoggerFactory.make();
public static final String ID = "eu.jucy.gui.Transfers";
private TableViewer tableViewer;
private Table table;
private TableViewerAdministrator<Object> tva;
private DelayedTableUpdater<Object> update;
@Override
public void createPartControl(final Composite parent) {
table = new Table(parent,SWT.BORDER | SWT.FULL_SELECTION);
tableViewer = new TableViewer(table);
table.setHeaderVisible(true);
UCProgressPainter.addToTable(table);
tva = new TableViewerAdministrator<Object>(tableViewer,
Arrays.asList(new UserColumn(),new HubColumn(),
new StatusColumn(), new TimeLeftColumn(),
new SpeedColumn(), new FilenameColumn(),
new SizeColumn(), new IPColumn()),GUIPI.transfersViewTable,2);
tva.apply();
update = new DelayedTableUpdater<Object>(tableViewer);
TransferContentProvider tcp = new TransferContentProvider();
tableViewer.setContentProvider(tcp);
setControlsForFontAndColour(table);
getSite().setSelectionProvider(tableViewer);
//makeActions();
createContextPopup(ID, tableViewer);
tableViewer.addDoubleClickListener(new CommandDoubleClickListener(OpenDirectoryHandler.ID));
List<ConnectionHandler> chs = ApplicationWorkbenchWindowAdvisor.get().getAllConnectionHandler();
tableViewer.setInput(chs);
//TOOD change model -> registering with every connection Handler is bad..
for (ConnectionHandler ch:chs) {
ch.addObserver(this);
ch.addTransferObserver(transferListener2);
// for (Object o : ch.getActive()) {
// if (o instanceof ClientProtocol) {
// IFileTransfer ift = ((ClientProtocol)o).getFileTransfer();
// if (ift != null) {
// ift.addObserver(transferListener);
// }
// }
// }
}
new ToolTipProvider<Object>(table) {
@Override
protected String getToolTip(Object o) {
IUser other = null;
String s= null;
if (o instanceof ClientProtocol) {
ClientProtocol cp = (ClientProtocol)o;
if (cp.getCh().getDCC().getFilelist().isInitialized()) {// the gui thread can't wait for initialisation
other = cp.getUser();
File f = cp.getFti().getFile();
if (f != null) {
s = String.format(Lang.FileTFTooltip, f.getPath());
}
} else {
return Lang.RefreshFilelist;
}
}
if (o instanceof ClientProtocolStateMachine ) {
ClientProtocolStateMachine ccspm = (ClientProtocolStateMachine)o;
other = ccspm.getUser();
}
if (s == null) {
s = "";
} else {
s += "\n";
}
if (other != null && other.nrOfFilesInQueue() > 0) {
s+= String.format(Lang.FileTFTooltip2, other.nrOfFilesInQueue(),
SizeEnum.getReadableSize(other.sizeOfFilesInQueue()));
}
return s;
}
};
}
@Override
public void setFocus() {
table.setFocus();
}
@Override
public void dispose() {
update.clear();
List<ConnectionHandler> chs = ApplicationWorkbenchWindowAdvisor.get().getAllConnectionHandler();
for (ConnectionHandler ch:chs) {
ch.deleteObserver(this);
ch.deleteTransferObserver(transferListener2);
}
super.dispose();
}
public void update(IObservable<StatusObject> o, StatusObject arg) {
// logger.info(arg);
// logger.debug("addin so: "+arg.getDetail()+" "+arg +"\n" +(arg.getDetailObject() != null?arg.getDetailObject().getClass().getSimpleName():"") );
switch(arg.getDetail()) {
case ConnectionHandler.USER_IDENTIFIED_IN_CONNECTION:
if (arg.getDetailObject() != null) {
update.remove(arg.getDetailObject());
}
update.add(arg.getValue());
break;
case ConnectionHandler.CONNECTION_CLOSED:
update.remove(arg.getValue());
ClientProtocolStateMachine cpsm = (ClientProtocolStateMachine)arg.getDetailObject();
if (cpsm != null && cpsm.isActive()) {
update.add(cpsm);
}
break;
case ConnectionHandler.TRANSFER_STARTED:
update.remove(arg.getValue());
update.add(arg.getValue()); //do structural change.. sorting..
// ((IFileTransfer)arg.getDetailObject()).addObserver(transferListener);
break;
case ConnectionHandler.TRANSFER_FINISHED:
update.remove(arg.getValue());
update.add(arg.getValue()); //do structural change.. sorting..
// ((IFileTransfer)arg.getDetailObject()).deleteObserver(transferListener);
break;
case ConnectionHandler.STATEMACHINE_CREATED:
// logger.debug("adding cpsm2: "+((ClientProtocolStateMachine)arg.getDetailObject()).getUser());
update.add(arg.getDetailObject());
break;
case ConnectionHandler.STATEMACHINE_CHANGED:
update.change(arg.getDetailObject());
break;
case ConnectionHandler.STATEMACHINE_DESTROYED:
update.remove(arg.getDetailObject());
break;
}
}
// private final IObserver<TransferChange> transferListener = new IObserver<TransferChange>() {
// public void update(final IObservable<TransferChange> o, TransferChange arg) {
// new SUIJob() {
// @Override
// public void run() {
// if (!table.isDisposed()) {
// tableViewer.refresh(((AbstractFileTransfer)o).getClientProtocol());
// } else {
// o.deleteObserver(transferListener);
// }
// }
// }.schedule();
// }
// };
private final IObserver<StatusObject> transferListener2 = new IObserver<StatusObject>() {
@Override
public void update(IObservable<StatusObject> o, final StatusObject arg) {
new SUIJob(table) {
@Override
public void run() {
tableViewer.refresh(((AbstractFileTransfer)arg.getValue()).getClientProtocol());
}
}.schedule();
}
};
/**
*
* standard content provider will fetch ClientProtocols
* and StateMachines
*
* @author Quicksilver
*
*/
public static class TransferContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) {
List<?> lch = (List<?>)inputElement;
HashSet<Object> active = new HashSet<Object>();
for (Object ch:lch) {
active.addAll(((ConnectionHandler)ch).getActive());
}
return active.toArray();
}
public void dispose() {}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
}
}