/*
* 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 java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.global.GlobalManager;
import org.gudy.azureus2.core3.global.GlobalManagerListener;
import org.gudy.azureus2.core3.download.DownloadManagerPeerListener;
import org.gudy.azureus2.core3.peer.PEPeer;
import org.gudy.azureus2.core3.peer.PEPeerManager;
import org.gudy.azureus2.plugins.ui.tables.TableManager;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.views.peer.PeerInfoView;
import org.gudy.azureus2.ui.swt.views.peer.RemotePieceDistributionView;
import org.gudy.azureus2.ui.swt.views.table.TableViewSWT;
import org.gudy.azureus2.ui.swt.views.table.TableViewSWTMenuFillListener;
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.peers.*;
import com.aelitis.azureus.ui.common.table.*;
/**
* @author Olivier
* @author TuxPaper
* 2004/Apr/20: Use TableRowImpl instead of PeerRow
* 2004/Apr/20: Remove need for tableItemToObject
* 2004/Apr/21: extends TableView instead of IAbstractView
* @author MjrTom
* 2005/Oct/08: Add PieceItem
*/
public class PeerSuperView
extends TableViewTab
implements GlobalManagerListener, DownloadManagerPeerListener,
TableLifeCycleListener, TableViewSWTMenuFillListener
{
private static final TableColumnCore[] basicItems;
static {
TableColumnCore[] items = PeersView.getBasicColumnItems(TableManager.TABLE_ALL_PEERS);
basicItems = new TableColumnCore[items.length + 1];
System.arraycopy(items, 0, basicItems, 0, items.length);
basicItems[items.length] = new DownloadNameItem(TableManager.TABLE_ALL_PEERS);
}
private GlobalManager g_manager;
private TableViewSWT tv;
private Shell shell;
private boolean active_listener = true;
/**
* Initialize
*
*/
public PeerSuperView(GlobalManager gm) {
tv = new TableViewSWTImpl(TableManager.TABLE_ALL_PEERS, "AllPeersView",
basicItems, "connected_time", SWT.MULTI | SWT.FULL_SELECTION | SWT.VIRTUAL);
setTableView(tv);
tv.setRowDefaultHeight(16);
tv.setEnableTabViews(true);
tv.setCoreTabViews(new IView[] {
new PeerInfoView(),
new RemotePieceDistributionView(),
new LoggerView()
});
tv.addLifeCycleListener(this);
tv.addMenuFillListener(this);
this.g_manager = gm;
}
// @see com.aelitis.azureus.ui.common.table.TableLifeCycleListener#tableViewInitialized()
public void tableViewInitialized() {
if (tv instanceof TableViewSWT) {
shell = ((TableViewSWT)tv).getComposite().getShell();
} else {
shell = Utils.findAnyShell();
}
registerGlobalManagerListener();
}
public void tableViewDestroyed() {
unregisterListeners();
}
public void fillMenu(final Menu menu) {
PeersView.fillMenu(menu, tv, shell, false);
}
/* DownloadManagerPeerListener implementation */
public void peerAdded(PEPeer created) {
tv.addDataSource(created);
}
public void peerRemoved(PEPeer removed) {
tv.removeDataSource(removed);
}
/**
* 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 (g_manager == null || tv.isDisposed()) {
return;
}
ArrayList sources = new ArrayList();
Iterator itr = g_manager.getDownloadManagers().iterator();
while (itr.hasNext()) {
Object[] peers = ((DownloadManager)itr.next()).getCurrentPeers();
if (peers != null) {
sources.addAll(Arrays.asList(peers));
}
}
if (sources.isEmpty()) {
return;
}
tv.addDataSources(sources.toArray());
tv.processDataSourceQueue();
}
private void registerGlobalManagerListener() {
this.active_listener = false;
try {g_manager.addListener(this);}
finally {this.active_listener = true;}
addExistingDatasources();
}
private void unregisterListeners() {
if (this.g_manager == null) {return;}
this.g_manager.removeListener(this);
Iterator itr = g_manager.getDownloadManagers().iterator();
while(itr.hasNext()) {
DownloadManager dm = (DownloadManager)itr.next();
downloadManagerRemoved(dm);
}
}
public void downloadManagerAdded(DownloadManager dm) {
dm.addPeerListener(this, !this.active_listener);
}
public void downloadManagerRemoved(DownloadManager dm) {
dm.removePeerListener(this);
}
// Methods I have to implement but have no need for...
public void destroyInitiated() {}
public void destroyed() {}
public void seedingStatusChanged(boolean seeding_only_mode) {}
public void addThisColumnSubMenu(String columnName, Menu menuThisColumn) {}
public void peerManagerAdded(PEPeerManager manager){}
public void peerManagerRemoved(PEPeerManager manager) {}
public void peerManagerWillBeAdded(PEPeerManager manager) {}
}