/**
* Copyright (C) Azureus Software, Inc, 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, 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
package org.gudy.azureus2.ui.swt.views.peer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.gudy.azureus2.core3.disk.DiskManagerFileInfo;
import org.gudy.azureus2.core3.peer.PEPeer;
import org.gudy.azureus2.core3.util.DisplayFormatters;
import org.gudy.azureus2.plugins.ui.tables.TableCell;
import org.gudy.azureus2.plugins.ui.tables.TableCellRefreshListener;
import org.gudy.azureus2.plugins.ui.tables.TableColumn;
import org.gudy.azureus2.ui.swt.views.table.CoreTableColumnSWT;
import org.gudy.azureus2.ui.swt.views.table.TableViewSWT;
import org.gudy.azureus2.ui.swt.views.table.impl.TableViewFactory;
import org.gudy.azureus2.ui.swt.views.table.impl.TableViewTab;
import com.aelitis.azureus.core.peermanager.piecepicker.util.BitFlags;
import com.aelitis.azureus.ui.common.table.*;
import com.aelitis.azureus.ui.common.table.impl.TableColumnManager;
public class PeerFilesView
extends TableViewTab<PeerFilesView.PeersFilesViewRow>
implements TableDataSourceChangedListener, TableLifeCycleListener, TableRefreshListener
{
public static final String TABLEID_PEER_FILES = "PeerFiles";
boolean refreshing = false;
private static final TableColumnCore[] basicItems = {
new NameItem(),
new PercentItem(),
};
static{
TableColumnManager tcManager = TableColumnManager.getInstance();
tcManager.setDefaultColumnNames( TABLEID_PEER_FILES, basicItems );
}
private TableViewSWT<PeersFilesViewRow> tv;
private PEPeer current_peer;
public PeerFilesView() {
super( "PeerFilesView");
}
public TableViewSWT<PeersFilesViewRow>
initYourTableView()
{
tv = TableViewFactory.createTableViewSWT(
PeersFilesViewRow.class,
TABLEID_PEER_FILES, getPropertiesPrefix(), basicItems,
"firstpiece", SWT.MULTI | SWT.FULL_SELECTION | SWT.VIRTUAL);
tv.setRowDefaultIconSize(new Point(16, 16));
tv.addTableDataSourceChangedListener(this, true);
tv.addRefreshListener(this, true);
tv.addLifeCycleListener(this);
return tv;
}
public void
tableDataSourceChanged(
Object newDataSource)
{
if ( newDataSource instanceof PEPeer ){
current_peer = (PEPeer)newDataSource;
}if ( newDataSource instanceof Object[] ){
Object[] temp = (Object[])newDataSource;
if ( temp.length > 0 && temp[0] instanceof PEPeer ){
current_peer = (PEPeer)temp[0];
}else{
current_peer = null;
}
}else{
current_peer = null;
}
}
public void
tableRefresh()
{
synchronized( this ){
if ( refreshing ){
return;
}
refreshing = true;
}
try{
PEPeer peer = current_peer;
if ( peer == null ){
tv.removeAllTableRows();
}else{
if ( tv.getRowCount() == 0 ){
DiskManagerFileInfo[] files = peer.getManager().getDiskManager().getFiles();
PeersFilesViewRow[] rows = new PeersFilesViewRow[ files.length ];
for ( int i=0;i<files.length;i++ ){
rows[i] = new PeersFilesViewRow( files[i], peer );
}
tv.addDataSources( rows );
tv.processDataSourceQueueSync();
}else{
TableRowCore[] rows = tv.getRows();
for ( TableRowCore row: rows ){
((PeersFilesViewRow)row.getDataSource()).setPeer( peer );
}
}
}
}finally{
synchronized( this ){
refreshing = false;
}
}
}
public void tableViewInitialized() {
}
public void tableViewTabInitComplete() {
super.tableViewTabInitComplete();
}
public void tableViewDestroyed() {
}
protected static class
PeersFilesViewRow
{
private DiskManagerFileInfo file;
private PEPeer peer;
private
PeersFilesViewRow(
DiskManagerFileInfo _file,
PEPeer _peer )
{
file = _file;
peer = _peer;
}
private DiskManagerFileInfo
getFile()
{
return( file );
}
private void
setPeer(
PEPeer _peer )
{
peer = _peer;
}
private PEPeer
getPeer()
{
return( peer );
}
}
private static class
NameItem
extends CoreTableColumnSWT
implements TableCellRefreshListener
{
private
NameItem()
{
super( "name", ALIGN_LEAD, POSITION_LAST, 300, TABLEID_PEER_FILES );
setType(TableColumn.TYPE_TEXT);
}
public void
refresh(
TableCell cell )
{
PeersFilesViewRow row = (PeersFilesViewRow) cell.getDataSource();
String name = (row == null) ? "" : row.getFile().getFile(true).getName();
if (name == null)
name = "";
cell.setText( name );
}
}
private static class
PercentItem
extends CoreTableColumnSWT
implements TableCellRefreshListener
{
private
PercentItem()
{
super( "%", ALIGN_TRAIL, POSITION_LAST, 60, TABLEID_PEER_FILES );
setRefreshInterval(INTERVAL_LIVE);
setMinWidthAuto(true);
}
public void
refresh(
TableCell cell )
{
PeersFilesViewRow row = (PeersFilesViewRow) cell.getDataSource();
if ( row == null ){
return;
}
DiskManagerFileInfo file = row.getFile();
PEPeer peer = row.getPeer();
BitFlags pieces = peer.getAvailable();
if( pieces == null ){
cell.setText( "" );
return;
}
boolean[] flags = pieces.flags;
int first_piece = file.getFirstPieceNumber();
int last_piece = file.getLastPieceNumber();
int done = 0;
for ( int i=first_piece;i<=last_piece;i++){
if ( flags[i] ){
done++;
}
}
int percent = ( done * 1000 ) / (last_piece - first_piece + 1 );
cell.setText(percent < 0 ? ""
: DisplayFormatters.formatPercentFromThousands((int) percent));
}
}
}