/*
* Created on 2 juil. 2003
*
* Copyright (C) 2004, 2005, 2006 Aelitis SAS, All rights Reserved
*
* 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.
*
* 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 ( see the LICENSE file ).
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* AELITIS, SAS au capital de 46,603.30 euros,
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*/
package org.gudy.azureus2.ui.swt.views;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.download.DownloadManagerPeerListener;
import org.gudy.azureus2.core3.download.DownloadManagerPieceListener;
import org.gudy.azureus2.core3.peer.PEPeer;
import org.gudy.azureus2.core3.peer.PEPeerManager;
import org.gudy.azureus2.core3.peer.PEPiece;
import org.gudy.azureus2.ui.swt.components.Legend;
import org.gudy.azureus2.ui.swt.views.piece.MyPieceDistributionView;
import org.gudy.azureus2.ui.swt.views.piece.PieceInfoView;
import org.gudy.azureus2.ui.swt.views.table.TableViewSWT;
import org.gudy.azureus2.ui.swt.views.table.impl.TableViewSWTImpl;
import org.gudy.azureus2.ui.swt.views.table.impl.TableViewTab;
import org.gudy.azureus2.ui.swt.views.tableitems.pieces.*;
import com.aelitis.azureus.ui.common.table.TableColumnCore;
import com.aelitis.azureus.ui.common.table.TableDataSourceChangedListener;
import com.aelitis.azureus.ui.common.table.TableLifeCycleListener;
import org.gudy.azureus2.plugins.ui.tables.TableManager;
/**
* @author Olivier
* @author TuxPaper
* 2004/Apr/20: Remove need for tableItemToObject
* 2004/Apr/21: extends TableView instead of IAbstractView
* @author MjrTom
* 2005/Oct/08: Add PriorityItem, SpeedItem
*/
public class PiecesView
extends TableViewTab
implements DownloadManagerPeerListener,
DownloadManagerPieceListener,
TableDataSourceChangedListener,
TableLifeCycleListener
{
private final static TableColumnCore[] basicItems = {
new PieceNumberItem(),
new SizeItem(),
new BlockCountItem(),
new BlocksItem(),
new CompletedItem(),
new AvailabilityItem(),
new TypeItem(),
new ReservedByItem(),
new WritersItem(),
new PriorityItem(),
new SpeedItem(),
new RequestedItem()
};
DownloadManager manager;
private TableViewSWTImpl tv;
private Composite legendComposite;
private PieceInfoView pieceInfoView;
private MyPieceDistributionView pieceDistView;
/**
* Initialize
*
*/
public PiecesView() {
tv = new TableViewSWTImpl(TableManager.TABLE_TORRENT_PIECES, "PiecesView",
basicItems, basicItems[0].getName(), SWT.SINGLE | SWT.FULL_SELECTION
| SWT.VIRTUAL);
setTableView(tv);
tv.setEnableTabViews(true);
pieceInfoView = new PieceInfoView();
pieceDistView = new MyPieceDistributionView();
tv.setCoreTabViews(new IView[] {
pieceInfoView,pieceDistView
});
tv.addTableDataSourceChangedListener(this, true);
tv.addLifeCycleListener(this);
}
// @see com.aelitis.azureus.ui.common.table.TableDataSourceChangedListener#tableDataSourceChanged(java.lang.Object)
public void tableDataSourceChanged(Object newDataSource) {
if (manager != null){
manager.removePeerListener(this);
manager.removePieceListener(this);
}
if (newDataSource == null)
manager = null;
else if (newDataSource instanceof Object[])
manager = (DownloadManager)((Object[])newDataSource)[0];
else
manager = (DownloadManager)newDataSource;
if (manager != null) {
manager.addPeerListener(this, false);
manager.addPieceListener(this, false);
addExistingDatasources();
}
if (pieceInfoView != null) {
pieceInfoView.dataSourceChanged(manager);
}
if (pieceDistView != null) {
pieceDistView.dataSourceChanged(manager);
}
}
// @see com.aelitis.azureus.ui.common.table.TableLifeCycleListener#tableViewInitialized()
public void tableViewInitialized() {
if (legendComposite != null && (tv instanceof TableViewSWT)) {
Composite composite = ((TableViewSWT) tv).getTableComposite();
legendComposite = Legend.createLegendComposite(composite,
BlocksItem.colors, new String[] {
"PiecesView.legend.requested",
"PiecesView.legend.written",
"PiecesView.legend.downloaded",
"PiecesView.legend.incache"
});
}
if (manager != null) {
manager.removePeerListener(this);
manager.removePieceListener(this);
manager.addPeerListener(this, false);
manager.addPieceListener(this, false);
addExistingDatasources();
}
}
// @see com.aelitis.azureus.ui.common.table.TableLifeCycleListener#tableViewDestroyed()
public void tableViewDestroyed() {
if (legendComposite != null && legendComposite.isDisposed()) {
legendComposite.dispose();
}
if (manager != null) {
manager.removePeerListener(this);
manager.removePieceListener(this);
}
}
/* DownloadManagerPeerListener implementation */
public void pieceAdded(PEPiece created) {
tv.addDataSource(created);
}
public void pieceRemoved(PEPiece removed) {
tv.removeDataSource(removed);
}
public void peerAdded(PEPeer peer) { }
public void peerRemoved(PEPeer peer) { }
public void peerManagerWillBeAdded( PEPeerManager peer_manager ){}
public void peerManagerAdded(PEPeerManager manager) { }
public void peerManagerRemoved(PEPeerManager manager) {
tv.removeAllTableRows();
}
/**
* Add datasources already in existance before we called addListener.
* Faster than allowing addListener to call us one datasource at a time.
*/
private void addExistingDatasources() {
if (manager == null || tv.isDisposed()) {
return;
}
Object[] dataSources = manager.getCurrentPieces();
if (dataSources == null || dataSources.length == 0)
return;
tv.addDataSources(dataSources);
tv.processDataSourceQueue();
}
/**
* @return the manager
*/
public DownloadManager getManager() {
return manager;
}
}