/** * Copyright (C) 2007 Aelitis, 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. * * AELITIS, SAS au capital de 63.529,40 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. * */ package org.gudy.azureus2.ui.swt.views.piece; import java.util.Iterator; import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.MenuEvent; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseTrackAdapter; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.gudy.azureus2.core3.config.COConfigurationManager; import org.gudy.azureus2.core3.disk.DiskManager; import org.gudy.azureus2.core3.disk.DiskManagerPiece; import org.gudy.azureus2.core3.disk.impl.DiskManagerImpl; import org.gudy.azureus2.core3.download.DownloadManager; import org.gudy.azureus2.core3.download.DownloadManagerPieceListener; import org.gudy.azureus2.core3.internat.MessageText; import org.gudy.azureus2.core3.logging.LogEvent; import org.gudy.azureus2.core3.logging.LogIDs; import org.gudy.azureus2.core3.logging.Logger; 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.core3.util.AERunnable; import org.gudy.azureus2.core3.util.Debug; import org.gudy.azureus2.ui.swt.MenuBuildUtils; import org.gudy.azureus2.ui.swt.Messages; import org.gudy.azureus2.ui.swt.Utils; import org.gudy.azureus2.ui.swt.components.Legend; import org.gudy.azureus2.ui.swt.debug.UIDebugGenerator; import org.gudy.azureus2.ui.swt.mainwindow.Colors; import org.gudy.azureus2.ui.swt.plugins.UISWTView; import org.gudy.azureus2.ui.swt.plugins.UISWTViewEvent; import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTViewCoreEventListener; import com.aelitis.azureus.core.peermanager.PeerManager; import com.aelitis.azureus.core.peermanager.piecepicker.PiecePicker; import com.aelitis.azureus.util.MapUtils; /** * @author TuxPaper * @created Feb 26, 2007 * */ public class PieceInfoView implements DownloadManagerPieceListener, UISWTViewCoreEventListener { private final static int BLOCK_FILLSIZE = 14; private final static int BLOCK_SPACING = 3; private final static int BLOCK_SIZE = BLOCK_FILLSIZE + BLOCK_SPACING; private final static int BLOCKCOLOR_HAVE = 0; private final static int BLOCKCOLORL_NOHAVE = 1; private final static int BLOCKCOLOR_TRANSFER = 2; private final static int BLOCKCOLOR_NEXT = 3; private final static int BLOCKCOLOR_AVAILCOUNT = 4; public static final String MSGID_PREFIX = "PieceInfoView"; private Composite pieceInfoComposite; private ScrolledComposite sc; protected Canvas pieceInfoCanvas; private Color[] blockColors; private Label topLabel; private String topLabelLHS = ""; private String topLabelRHS = ""; private Label imageLabel; // More delay for this view because of high workload private int graphicsUpdate = COConfigurationManager.getIntParameter("Graphics Update") * 2; private int loopFactor = 0; private Font font = null; Image img = null; private DownloadManager dlm; BlockInfo[] oldBlockInfo; /** * Initialize * */ public PieceInfoView() { blockColors = new Color[] { Colors.blues[Colors.BLUES_DARKEST], Colors.white, Colors.red, Colors.fadedRed, Colors.black }; } private void dataSourceChanged(Object newDataSource) { //System.out.println( "dsc: dlm=" + dlm + ", new=" + (newDataSource instanceof Object[]?((Object[])newDataSource)[0]:newDataSource)); if ( newDataSource == null ){ synchronized( this ){ if (dlm != null) { dlm.removePieceListener(this); } dlm = null; } }else if (newDataSource instanceof DownloadManager) { oldBlockInfo = null; synchronized( this ){ if (dlm != null) { dlm.removePieceListener(this); } dlm = (DownloadManager)newDataSource; dlm.addPieceListener(this, false); } fillPieceInfoSection(); }else if (newDataSource instanceof Object[]) { Object[] objects = (Object[]) newDataSource; if (objects.length > 0 && (objects[0] instanceof PEPiece)) { PEPiece piece = (PEPiece) objects[0]; DiskManager diskManager = piece.getDMPiece().getManager(); if (diskManager instanceof DiskManagerImpl) { DiskManagerImpl dmi = (DiskManagerImpl) diskManager; synchronized( this ){ if (dlm != null) { dlm.removePieceListener(this); } dlm = dmi.getDownloadManager(); dlm.addPieceListener(this, false); } fillPieceInfoSection(); } } else if (objects.length > 0 && (objects[0] instanceof DownloadManager)) { oldBlockInfo = null; synchronized( this ){ if (dlm != null) { dlm.removePieceListener(this); } dlm = (DownloadManager)objects[0]; dlm.addPieceListener(this, false); } fillPieceInfoSection(); } } } private String getFullTitle() { return MessageText.getString("PeersView.BlockView.title"); } private void initialize(Composite composite) { if (pieceInfoComposite != null && !pieceInfoComposite.isDisposed()) { Logger.log(new LogEvent(LogIDs.GUI, LogEvent.LT_ERROR, "PeerInfoView already initialized! Stack: " + Debug.getStackTrace(true, false))); delete(); } createPeerInfoPanel(composite); fillPieceInfoSection(); } private Composite createPeerInfoPanel(Composite parent) { GridLayout layout; GridData gridData; // Peer Info section contains // - Peer's Block display // - Peer's Datarate pieceInfoComposite = new Composite(parent, SWT.NONE); layout = new GridLayout(); layout.numColumns = 2; layout.horizontalSpacing = 0; layout.verticalSpacing = 0; layout.marginHeight = 0; layout.marginWidth = 0; pieceInfoComposite.setLayout(layout); gridData = new GridData(GridData.FILL, GridData.FILL, true, true); pieceInfoComposite.setLayoutData(gridData); imageLabel = new Label(pieceInfoComposite, SWT.NULL); gridData = new GridData(); imageLabel.setLayoutData(gridData); topLabel = new Label(pieceInfoComposite, SWT.NULL); gridData = new GridData(SWT.FILL, SWT.DEFAULT, false, false); topLabel.setLayoutData(gridData); sc = new ScrolledComposite(pieceInfoComposite, SWT.V_SCROLL); sc.setExpandHorizontal(true); sc.setExpandVertical(true); layout = new GridLayout(); layout.horizontalSpacing = 0; layout.verticalSpacing = 0; layout.marginHeight = 0; layout.marginWidth = 0; sc.setLayout(layout); gridData = new GridData(GridData.FILL, GridData.FILL, true, true, 2, 1); sc.setLayoutData(gridData); sc.getVerticalBar().setIncrement(BLOCK_SIZE); pieceInfoCanvas = new Canvas(sc, SWT.NO_REDRAW_RESIZE | SWT.NO_BACKGROUND); gridData = new GridData(GridData.FILL, SWT.DEFAULT, true, false); pieceInfoCanvas.setLayoutData(gridData); pieceInfoCanvas.addPaintListener(new PaintListener() { public void paintControl(PaintEvent e) { if (e.width <= 0 || e.height <= 0) return; try { Rectangle bounds = (img == null) ? null : img.getBounds(); if (bounds == null || dlm == null || dlm.getPeerManager() == null ) { e.gc.fillRectangle(e.x, e.y, e.width, e.height); } else { if (e.x + e.width > bounds.width) e.gc.fillRectangle(bounds.width, e.y, e.x + e.width - bounds.width + 1, e.height); if (e.y + e.height > bounds.height) e.gc.fillRectangle(e.x, bounds.height, e.width, e.y + e.height - bounds.height + 1); int width = Math.min(e.width, bounds.width - e.x); int height = Math.min(e.height, bounds.height - e.y); e.gc.drawImage(img, e.x, e.y, width, height, e.x, e.y, width, height); } } catch (Exception ex) { } } }); Listener doNothingListener = new Listener() { public void handleEvent(Event event) { } }; pieceInfoCanvas.addListener(SWT.KeyDown, doNothingListener); pieceInfoCanvas.addListener(SWT.Resize, new Listener() { public void handleEvent(Event e) { synchronized (PieceInfoView.this) { if (alreadyFilling) { return; } alreadyFilling = true; } // wrap in asyncexec because sc.setMinWidth (called later) doesn't work // too well inside a resize (the canvas won't size isn't always updated) Utils.execSWTThreadLater(0, new AERunnable() { public void runSupport() { if (img != null) { int iOldColCount = img.getBounds().width / BLOCK_SIZE; int iNewColCount = pieceInfoCanvas.getClientArea().width / BLOCK_SIZE; if (iOldColCount != iNewColCount) refreshInfoCanvas(); } synchronized (PieceInfoView.this) { alreadyFilling = false; } } }); } }); sc.setContent(pieceInfoCanvas); pieceInfoCanvas.addMouseTrackListener( new MouseTrackAdapter() { public void mouseHover( MouseEvent event ) { int piece_number = getPieceNumber( event.x, event.y ); if ( piece_number >= 0 ){ DiskManager disk_manager = dlm.getDiskManager(); PEPeerManager pm = dlm.getPeerManager(); DiskManagerPiece dm_piece = disk_manager.getPiece( piece_number ); PEPiece pm_piece = pm.getPiece( piece_number ); String text = "Piece " + piece_number + ": " + dm_piece.getString(); if ( pm_piece != null ){ text += ", active: " + pm_piece.getString(); }else{ if ( dm_piece.isNeeded() && !dm_piece.isDone()){ text += ", inactive: " + pm.getPiecePicker().getPieceString( piece_number ); } } topLabelRHS = text; }else{ topLabelRHS = ""; } updateTopLabel(); } }); final Menu menu = new Menu(pieceInfoCanvas.getShell(), SWT.POP_UP ); pieceInfoCanvas.setMenu( menu ); pieceInfoCanvas.addListener( SWT.MenuDetect, new Listener() { public void handleEvent( Event event) { Point pt = pieceInfoCanvas.toControl(event.x, event.y); int piece_number = getPieceNumber( pt.x, pt.y ); menu.setData( "pieceNumber", piece_number ); } }); MenuBuildUtils.addMaintenanceListenerForMenu( menu, new MenuBuildUtils.MenuBuilder() { public void buildMenu( Menu menu, MenuEvent event) { Integer pn = (Integer)menu.getData( "pieceNumber" ); if ( pn != null && pn != -1 ){ DownloadManager download_manager = dlm; if ( download_manager == null ){ return; } DiskManager disk_manager = download_manager.getDiskManager(); PEPeerManager peer_manager = download_manager.getPeerManager(); if ( disk_manager == null || peer_manager == null ){ return; } final PiecePicker picker = peer_manager.getPiecePicker(); DiskManagerPiece[] dm_pieces = disk_manager.getPieces(); final int piece_number = pn; DiskManagerPiece dm_piece = dm_pieces[piece_number]; final MenuItem force_piece = new MenuItem( menu, SWT.CHECK ); Messages.setLanguageText( force_piece, "label.force.piece" ); boolean done = dm_piece.isDone(); force_piece.setEnabled( !done ); if ( !done ){ force_piece.setSelection( picker.isForcePiece( piece_number )); force_piece.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e) { picker.setForcePiece( piece_number, force_piece.getSelection()); } }); } } } }); Legend.createLegendComposite(pieceInfoComposite, blockColors, new String[] { "PiecesView.BlockView.Have", "PiecesView.BlockView.NoHave", "PeersView.BlockView.Transfer", "PeersView.BlockView.NextRequest", "PeersView.BlockView.AvailCount" }, new GridData(SWT.FILL, SWT.DEFAULT, true, false, 2, 1)); int iFontPixelsHeight = 10; int iFontPointHeight = (iFontPixelsHeight * 72) / pieceInfoCanvas.getDisplay().getDPI().y; Font f = pieceInfoCanvas.getFont(); FontData[] fontData = f.getFontData(); fontData[0].setHeight(iFontPointHeight); font = new Font(pieceInfoCanvas.getDisplay(), fontData); return pieceInfoComposite; } private int getPieceNumber( int x, int y ) { DownloadManager manager = dlm; if ( manager == null ){ return( -1 ); } PEPeerManager pm = manager.getPeerManager(); if ( pm == null ){ return( -1 ); } Rectangle bounds = pieceInfoCanvas.getClientArea(); if (bounds.width <= 0 || bounds.height <= 0){ return( -1 ); } int iNumCols = bounds.width / BLOCK_SIZE; int x_block = x/BLOCK_SIZE; int y_block = y/BLOCK_SIZE; int piece_number = y_block*iNumCols + x_block; if ( piece_number >= pm.getPiecePicker().getNumberOfPieces()){ return( -1 ); }else{ return( piece_number ); } } private boolean alreadyFilling = false; private UISWTView swtView; private void fillPieceInfoSection() { synchronized (this) { if (alreadyFilling) { return; } alreadyFilling = true; } Utils.execSWTThreadLater(100, new AERunnable() { public void runSupport() { synchronized (PieceInfoView.this) { if (!alreadyFilling) { return; } } try { if (imageLabel == null || imageLabel.isDisposed()) { return; } if (imageLabel.getImage() != null) { Image image = imageLabel.getImage(); imageLabel.setImage(null); image.dispose(); } refreshInfoCanvas(); } finally { synchronized (PieceInfoView.this) { alreadyFilling = false; } } } }); } private void refresh() { if (loopFactor++ % graphicsUpdate == 0) { refreshInfoCanvas(); } } private void updateTopLabel() { String text = topLabelLHS; if ( text.length() > 0 && topLabelRHS.length() > 0 ){ text += "; " + topLabelRHS; } topLabel.setText( text ); } protected void refreshInfoCanvas() { synchronized (PieceInfoView.this) { alreadyFilling = false; } if (!pieceInfoCanvas.isVisible()) { return; } pieceInfoCanvas.layout(true); Rectangle bounds = pieceInfoCanvas.getClientArea(); if (bounds.width <= 0 || bounds.height <= 0) { topLabelLHS = ""; updateTopLabel(); return; } if (dlm == null) { GC gc = new GC(pieceInfoCanvas); gc.fillRectangle(bounds); gc.dispose(); topLabelLHS = ""; updateTopLabel(); return; } PEPeerManager pm = dlm.getPeerManager(); DiskManager dm = dlm.getDiskManager(); if (pm == null || dm == null) { GC gc = new GC(pieceInfoCanvas); gc.fillRectangle(bounds); gc.dispose(); topLabelLHS = ""; updateTopLabel(); return; } int iNumCols = bounds.width / BLOCK_SIZE; int iNeededHeight = (((dm.getNbPieces() - 1) / iNumCols) + 1) * BLOCK_SIZE; if (img != null && !img.isDisposed()) { Rectangle imgBounds = img.getBounds(); if (imgBounds.width != bounds.width || imgBounds.height != iNeededHeight) { oldBlockInfo = null; img.dispose(); img = null; } } DiskManagerPiece[] dm_pieces = dm.getPieces(); PEPiece[] currentDLPieces = pm.getPieces(); byte[] uploadingPieces = new byte[dm_pieces.length]; // find upload pieces Iterator<PEPeer> peer_it = pm.getPeers().iterator(); while( peer_it.hasNext()){ PEPeer peer = peer_it.next(); int[] peerRequestedPieces = peer.getIncomingRequestedPieceNumbers(); if (peerRequestedPieces != null && peerRequestedPieces.length > 0) { int pieceNum = peerRequestedPieces[0]; if(uploadingPieces[pieceNum] < 2) uploadingPieces[pieceNum] = 2; for (int j = 1; j < peerRequestedPieces.length; j++) { pieceNum = peerRequestedPieces[j]; if(uploadingPieces[pieceNum] < 1) uploadingPieces[pieceNum] = 1; } } } if (sc.getMinHeight() != iNeededHeight) { sc.setMinHeight(iNeededHeight); sc.layout(true, true); bounds = pieceInfoCanvas.getClientArea(); } int[] availability = pm.getAvailability(); int minAvailability = Integer.MAX_VALUE; int minAvailability2 = Integer.MAX_VALUE; if (availability != null && availability.length > 0) { for (int i = 0; i < availability.length; i++) { if (availability[i] != 0 && availability[i] < minAvailability) { minAvailability2 = minAvailability; minAvailability = availability[i]; if (minAvailability == 1) { break; } } } } if (img == null) { img = new Image(pieceInfoCanvas.getDisplay(), bounds.width, iNeededHeight); } GC gcImg = new GC(img); BlockInfo[] newBlockInfo = new BlockInfo[dm_pieces.length]; int iRow = 0; try { // use advanced capabilities for faster drawText gcImg.setAdvanced(true); if (oldBlockInfo == null) { gcImg.setBackground(pieceInfoCanvas.getBackground()); gcImg.fillRectangle(0, 0, bounds.width, iNeededHeight); } gcImg.setFont(font); int iCol = 0; for (int i = 0; i < dm_pieces.length; i++) { if (iCol >= iNumCols) { iCol = 0; iRow++; } newBlockInfo[i] = new BlockInfo(); int colorIndex; boolean done = dm_pieces[i].isDone(); int iXPos = iCol * BLOCK_SIZE + 1; int iYPos = iRow * BLOCK_SIZE + 1; if (done) { colorIndex = BLOCKCOLOR_HAVE; newBlockInfo[i].haveWidth = BLOCK_FILLSIZE; } else { // !done boolean partiallyDone = dm_pieces[i].getNbWritten() > 0; int width = BLOCK_FILLSIZE; if (partiallyDone) { int iNewWidth = (int) (((float) dm_pieces[i].getNbWritten() / dm_pieces[i].getNbBlocks()) * width); if (iNewWidth >= width) iNewWidth = width - 1; else if (iNewWidth <= 0) iNewWidth = 1; newBlockInfo[i].haveWidth = iNewWidth; } } if (currentDLPieces[i] != null && currentDLPieces[i].hasUndownloadedBlock()) { newBlockInfo[i].downloadingIndicator = true; } newBlockInfo[i].uploadingIndicator = uploadingPieces[i] > 0; if (newBlockInfo[i].uploadingIndicator) { newBlockInfo[i].uploadingIndicatorSmall = uploadingPieces[i] < 2; } if (availability != null) { newBlockInfo[i].availNum = availability[i]; if (minAvailability2 == availability[i]) { newBlockInfo[i].availDotted = true; } } else { newBlockInfo[i].availNum = -1; } if (oldBlockInfo != null && i < oldBlockInfo.length && oldBlockInfo[i].sameAs(newBlockInfo[i])) { iCol++; continue; } gcImg.setBackground(pieceInfoCanvas.getBackground()); gcImg.fillRectangle(iCol * BLOCK_SIZE, iRow * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE); colorIndex = BLOCKCOLOR_HAVE; gcImg.setBackground(blockColors[colorIndex]); gcImg.fillRectangle(iXPos, iYPos, newBlockInfo[i].haveWidth, BLOCK_FILLSIZE); colorIndex = BLOCKCOLORL_NOHAVE; gcImg.setBackground(blockColors[colorIndex]); gcImg.fillRectangle(iXPos + newBlockInfo[i].haveWidth, iYPos, BLOCK_FILLSIZE - newBlockInfo[i].haveWidth, BLOCK_FILLSIZE); if (newBlockInfo[i].downloadingIndicator) { drawDownloadIndicator(gcImg, iXPos, iYPos, false); } if (newBlockInfo[i].uploadingIndicator) { drawUploadIndicator(gcImg, iXPos, iYPos, newBlockInfo[i].uploadingIndicatorSmall); } if (newBlockInfo[i].availNum != -1) { if (minAvailability == newBlockInfo[i].availNum) { gcImg.setForeground(blockColors[BLOCKCOLOR_AVAILCOUNT]); gcImg.drawRectangle(iXPos - 1, iYPos - 1, BLOCK_FILLSIZE + 1, BLOCK_FILLSIZE + 1); } if (minAvailability2 == newBlockInfo[i].availNum) { gcImg.setLineStyle(SWT.LINE_DOT); gcImg.setForeground(blockColors[BLOCKCOLOR_AVAILCOUNT]); gcImg.drawRectangle(iXPos - 1, iYPos - 1, BLOCK_FILLSIZE + 1, BLOCK_FILLSIZE + 1); gcImg.setLineStyle(SWT.LINE_SOLID); } String sNumber = String.valueOf(newBlockInfo[i].availNum); Point size = gcImg.stringExtent(sNumber); if (newBlockInfo[i].availNum < 100) { int x = iXPos + (BLOCK_FILLSIZE / 2) - (size.x / 2); int y = iYPos + (BLOCK_FILLSIZE / 2) - (size.y / 2); gcImg.setForeground(blockColors[BLOCKCOLOR_AVAILCOUNT]); gcImg.drawText(sNumber, x, y, true); } } iCol++; } oldBlockInfo = newBlockInfo; } catch (Exception e) { Logger.log(new LogEvent(LogIDs.GUI, "drawing piece map", e)); } finally { gcImg.dispose(); } topLabelLHS = MessageText.getString("PiecesView.BlockView.Header", new String[] { "" + iNumCols, "" + (iRow + 1), "" + dm_pieces.length }); updateTopLabel(); pieceInfoCanvas.redraw(); } private void drawDownloadIndicator(GC gcImg, int iXPos, int iYPos, boolean small) { if (small) { gcImg.setBackground(blockColors[BLOCKCOLOR_NEXT]); gcImg.fillPolygon(new int[] { iXPos + 2, iYPos + 2, iXPos + BLOCK_FILLSIZE - 1, iYPos + 2, iXPos + (BLOCK_FILLSIZE / 2), iYPos + BLOCK_FILLSIZE - 1 }); } else { gcImg.setBackground(blockColors[BLOCKCOLOR_TRANSFER]); gcImg.fillPolygon(new int[] { iXPos, iYPos, iXPos + BLOCK_FILLSIZE, iYPos, iXPos + (BLOCK_FILLSIZE / 2), iYPos + BLOCK_FILLSIZE }); } } private void drawUploadIndicator(GC gcImg, int iXPos, int iYPos, boolean small) { if (!small) { gcImg.setBackground(blockColors[BLOCKCOLOR_TRANSFER]); gcImg.fillPolygon(new int[] { iXPos, iYPos + BLOCK_FILLSIZE, iXPos + BLOCK_FILLSIZE, iYPos + BLOCK_FILLSIZE, iXPos + (BLOCK_FILLSIZE / 2), iYPos }); } else { // Small Up Arrow each upload request gcImg.setBackground(blockColors[BLOCKCOLOR_NEXT]); gcImg.fillPolygon(new int[] { iXPos + 1, iYPos + BLOCK_FILLSIZE - 2, iXPos + BLOCK_FILLSIZE - 2, iYPos + BLOCK_FILLSIZE - 2, iXPos + (BLOCK_FILLSIZE / 2), iYPos + 2 }); } } private Composite getComposite() { return pieceInfoComposite; } private void delete() { if (imageLabel != null && !imageLabel.isDisposed() && imageLabel.getImage() != null) { Image image = imageLabel.getImage(); imageLabel.setImage(null); image.dispose(); } if (img != null && !img.isDisposed()) { img.dispose(); img = null; } if (font != null && !font.isDisposed()) { font.dispose(); font = null; } synchronized( this ){ if ( dlm != null){ dlm.removePieceListener(this); dlm = null; } } } private Image obfusticatedImage(Image image) { UIDebugGenerator.obfusticateArea(image, topLabel, ""); return image; } // @see org.gudy.azureus2.core3.download.DownloadManagerPeerListener#pieceAdded(org.gudy.azureus2.core3.peer.PEPiece) public void pieceAdded(PEPiece piece) { fillPieceInfoSection(); } // @see org.gudy.azureus2.core3.download.DownloadManagerPeerListener#pieceRemoved(org.gudy.azureus2.core3.peer.PEPiece) public void pieceRemoved(PEPiece piece) { fillPieceInfoSection(); } private static class BlockInfo { public int haveWidth; int availNum; boolean availDotted; boolean uploadingIndicator; boolean uploadingIndicatorSmall; boolean downloadingIndicator; /** * */ public BlockInfo() { haveWidth = -1; } public boolean sameAs(BlockInfo otherBlockInfo) { return haveWidth == otherBlockInfo.haveWidth && availNum == otherBlockInfo.availNum && availDotted == otherBlockInfo.availDotted && uploadingIndicator == otherBlockInfo.uploadingIndicator && uploadingIndicatorSmall == otherBlockInfo.uploadingIndicatorSmall && downloadingIndicator == otherBlockInfo.downloadingIndicator; } } public boolean eventOccurred(UISWTViewEvent event) { switch (event.getType()) { case UISWTViewEvent.TYPE_CREATE: swtView = (UISWTView)event.getData(); swtView.setTitle(getFullTitle()); break; case UISWTViewEvent.TYPE_DESTROY: delete(); break; case UISWTViewEvent.TYPE_INITIALIZE: initialize((Composite)event.getData()); break; case UISWTViewEvent.TYPE_LANGUAGEUPDATE: Messages.updateLanguageForControl(getComposite()); swtView.setTitle(getFullTitle()); break; case UISWTViewEvent.TYPE_DATASOURCE_CHANGED: dataSourceChanged(event.getData()); break; case UISWTViewEvent.TYPE_FOCUSGAINED: break; case UISWTViewEvent.TYPE_REFRESH: refresh(); break; case UISWTViewEvent.TYPE_OBFUSCATE: Object data = event.getData(); if (data instanceof Map) { obfusticatedImage((Image) MapUtils.getMapObject((Map) data, "image", null, Image.class)); } break; } return true; } }