/* * 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.List; import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.gudy.azureus2.core3.disk.DiskManagerFileInfo; 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.plugins.ui.tables.TableManager; import org.gudy.azureus2.ui.swt.Messages; import org.gudy.azureus2.ui.swt.components.Legend; import org.gudy.azureus2.ui.swt.plugins.UISWTInstance; import org.gudy.azureus2.ui.swt.plugins.UISWTViewEvent; import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTViewCoreEventListener; import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTViewEventImpl; 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.TableViewSWTMenuFillListener; import org.gudy.azureus2.ui.swt.views.table.impl.TableViewFactory; import org.gudy.azureus2.ui.swt.views.table.impl.TableViewTab; import org.gudy.azureus2.ui.swt.views.tableitems.pieces.*; import com.aelitis.azureus.core.peermanager.piecepicker.PiecePicker; import com.aelitis.azureus.ui.common.ToolBarItem; 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 com.aelitis.azureus.ui.common.table.impl.TableColumnManager; import com.aelitis.azureus.ui.selectedcontent.SelectedContent; import com.aelitis.azureus.ui.selectedcontent.SelectedContentManager; import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT; import com.aelitis.azureus.ui.swt.UIFunctionsSWT; /** * @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<PEPiece> implements DownloadManagerPeerListener, DownloadManagerPieceListener, TableDataSourceChangedListener, TableLifeCycleListener, TableViewSWTMenuFillListener, UISWTViewCoreEventListener { private static boolean registeredCoreSubViews = false; 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() }; static{ TableColumnManager tcManager = TableColumnManager.getInstance(); tcManager.setDefaultColumnNames( TableManager.TABLE_TORRENT_PIECES, basicItems ); } public static final String MSGID_PREFIX = "PiecesView"; private DownloadManager manager; private boolean enable_tabs = true; private TableViewSWT<PEPiece> tv; private Composite legendComposite; /** * Initialize * */ public PiecesView() { super(MSGID_PREFIX); } // @see org.gudy.azureus2.ui.swt.views.table.impl.TableViewTab#initYourTableView() public TableViewSWT<PEPiece> initYourTableView() { tv = TableViewFactory.createTableViewSWT(PEPiece.class, TableManager.TABLE_TORRENT_PIECES, getPropertiesPrefix(), basicItems, basicItems[0].getName(), SWT.SINGLE | SWT.FULL_SELECTION | SWT.VIRTUAL); tv.setEnableTabViews(enable_tabs,true,null); UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT(); if (uiFunctions != null) { UISWTInstance pluginUI = uiFunctions.getUISWTInstance(); if (pluginUI != null && !registeredCoreSubViews) { pluginUI.addView(TableManager.TABLE_TORRENT_PIECES, "PieceInfoView", PieceInfoView.class, manager); pluginUI.addView(TableManager.TABLE_TORRENT_PIECES, "MyPieceDistributionView", MyPieceDistributionView.class, manager); registeredCoreSubViews = true; } } tv.addTableDataSourceChangedListener(this, true); tv.addMenuFillListener(this); tv.addLifeCycleListener(this); return tv; } public void fillMenu( String sColumnName, Menu menu ) { final List<Object> selected = tv.getSelectedDataSources(); if ( selected.size() == 0 ){ return; } if ( manager == null ){ return; } PEPeerManager pm = manager.getPeerManager(); if ( pm == null ){ return; } final PiecePicker picker = pm.getPiecePicker(); boolean has_undone = false; boolean has_unforced = false; for ( Object obj: selected ){ PEPiece piece = (PEPiece)obj; if ( !piece.getDMPiece().isDone()){ has_undone = true; if ( picker.isForcePiece( piece.getPieceNumber())){ has_unforced = true; } } } final MenuItem force_piece = new MenuItem( menu, SWT.CHECK ); Messages.setLanguageText( force_piece, "label.force.piece" ); force_piece.setEnabled( has_undone ); if ( has_undone ){ force_piece.setSelection( has_unforced ); force_piece.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e) { boolean forced = force_piece.getSelection(); for ( Object obj: selected ){ PEPiece piece = (PEPiece)obj; if ( !piece.getDMPiece().isDone()){ picker.setForcePiece( piece.getPieceNumber(), forced ); } } } }); } final MenuItem cancel_reqs_piece = new MenuItem( menu, SWT.PUSH ); Messages.setLanguageText( cancel_reqs_piece, "label.rerequest.blocks" ); cancel_reqs_piece.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e) { for ( Object obj: selected ){ PEPiece piece = (PEPiece)obj; for ( int i=0;i<piece.getNbBlocks();i++){ if ( piece.isRequested( i )){ piece.clearRequested( i ); } } } } }); new MenuItem( menu, SWT.SEPARATOR ); /* final MenuItem reset_piece = new MenuItem( menu, SWT.PUSH ); Messages.setLanguageText( reset_piece, "label.reset.piece" ); reset_piece.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e) { for ( Object obj: selected ){ PEPiece piece = (PEPiece)obj; piece.reset(); } } }); */ } public void addThisColumnSubMenu( String sColumnName, Menu menuThisColumn ) { } private boolean comp_focused; private Object focus_pending_ds; private void setFocused( boolean foc ) { if ( foc ){ comp_focused = true; dataSourceChanged( focus_pending_ds ); }else{ focus_pending_ds = manager; dataSourceChanged( null ); comp_focused = false; } } // @see com.aelitis.azureus.ui.common.table.TableDataSourceChangedListener#tableDataSourceChanged(java.lang.Object) public void tableDataSourceChanged(Object newDataSource) { if ( !comp_focused ){ focus_pending_ds = newDataSource; return; } DownloadManager old_manager = manager; if (newDataSource == null){ manager = null; }else if (newDataSource instanceof Object[]){ Object temp = ((Object[])newDataSource)[0]; if ( temp instanceof DownloadManager ){ manager = (DownloadManager)temp; }else if ( temp instanceof DiskManagerFileInfo){ manager = ((DiskManagerFileInfo)temp).getDownloadManager(); }else{ return; } }else{ if ( newDataSource instanceof DownloadManager ){ manager = (DownloadManager)newDataSource; }else if ( newDataSource instanceof DiskManagerFileInfo){ manager = ((DiskManagerFileInfo)newDataSource).getDownloadManager(); }else{ return; } } if ( old_manager == manager ){ return; } if (old_manager != null){ old_manager.removePeerListener(this); old_manager.removePieceListener(this); } if ( !tv.isDisposed()){ tv.removeAllTableRows(); if (manager != null) { manager.addPeerListener(this, false); manager.addPieceListener(this, false); addExistingDatasources(); } } } // @see com.aelitis.azureus.ui.common.table.TableLifeCycleListener#tableViewInitialized() public void tableViewInitialized() { if (legendComposite != null && tv != null) { Composite composite = ((TableViewSWT<PEPiece>) 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; } PEPiece[] dataSources = manager.getCurrentPieces(); if (dataSources == null || dataSources.length == 0) return; tv.addDataSources(dataSources); tv.processDataSourceQueue(); } /** * @return the manager */ public DownloadManager getManager() { return manager; } public boolean eventOccurred(UISWTViewEvent event) { switch (event.getType()) { case UISWTViewEvent.TYPE_CREATE:{ if ( event instanceof UISWTViewEventImpl ){ String parent = ((UISWTViewEventImpl)event).getParentID(); enable_tabs = parent != null && parent.equals( UISWTInstance.VIEW_TORRENT_DETAILS ); } break; } case UISWTViewEvent.TYPE_FOCUSGAINED: String id = "DMDetails_Pieces"; setFocused( true ); // do this here to pick up corrent manager before rest of code if (manager != null) { if (manager.getTorrent() != null) { id += "." + manager.getInternalName(); } else { id += ":" + manager.getSize(); } } SelectedContentManager.changeCurrentlySelectedContent(id, new SelectedContent[] { new SelectedContent(manager) }); break; case UISWTViewEvent.TYPE_FOCUSLOST: setFocused( false ); break; } return( super.eventOccurred(event)); } public boolean toolBarItemActivated(ToolBarItem item, long activationType, Object datasource) { if ( ViewUtils.toolBarItemActivated(manager, item, activationType, datasource)){ return( true ); } return( super.toolBarItemActivated(item, activationType, datasource)); } public void refreshToolBarItems(Map<String, Long> list) { ViewUtils.refreshToolBarItems(manager, list); super.refreshToolBarItems(list); } }