package com.aelitis.azureus.ui.swt.columns.torrent; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.*; import org.eclipse.swt.widgets.*; import org.gudy.azureus2.core3.disk.DiskManagerFileInfo; import org.gudy.azureus2.core3.download.DownloadManager; import org.gudy.azureus2.core3.internat.MessageText; import org.gudy.azureus2.core3.util.DisplayFormatters; import org.gudy.azureus2.plugins.ui.tables.TableCellMouseEvent; import org.gudy.azureus2.plugins.ui.tables.TableRowMouseEvent; import org.gudy.azureus2.ui.swt.Messages; import org.gudy.azureus2.ui.swt.TorrentUtil; import org.gudy.azureus2.ui.swt.mainwindow.Colors; import org.gudy.azureus2.ui.swt.shells.GCStringPrinter; import org.gudy.azureus2.ui.swt.views.FilesViewMenuUtil; import com.aelitis.azureus.ui.common.table.TableRowCore; import com.aelitis.azureus.ui.swt.imageloader.ImageLoader; import com.aelitis.azureus.ui.swt.skin.SWTSkinFactory; import com.aelitis.azureus.ui.swt.skin.SWTSkinProperties; import com.aelitis.azureus.ui.swt.utils.ColorCache; import com.aelitis.azureus.ui.swt.utils.FontUtils; public class ColumnTorrentFileProgress { private Image imgArrowButton; private Image imgPriHi; private Image imgPriNormal; private Image imgPriStopped; private Image imgBGfile; private Font progressFont; private Display display; private Color cBGdl; private Color cBGcd; private Color cBGskipped; public ColumnTorrentFileProgress(Display display) { this.display = display; ImageLoader imageLoader = ImageLoader.getInstance(); imgArrowButton = imageLoader.getImage("image.fileprogress.arrowbtn"); imgPriHi = imageLoader.getImage("image.fileprogress.pri.hi"); imgPriNormal = imageLoader.getImage("image.fileprogress.pri.normal"); imgPriStopped = imageLoader.getImage("image.fileprogress.pri.stopped"); imgBGfile = imageLoader.getImage("image.progress.bg.file"); SWTSkinProperties skinProperties = SWTSkinFactory.getInstance().getSkinProperties(); cBGdl = skinProperties.getColor("color.progress.bg.dl"); if (cBGdl == null) { cBGdl = Colors.blues[Colors.BLUES_DARKEST]; } cBGcd = skinProperties.getColor("color.progress.bg.cd"); if (cBGcd == null) { cBGcd = Colors.green; } cBGskipped = skinProperties.getColor("color.progress.bg.cd"); } void fillInfoProgressETA(TableRowCore row, GC gc, DiskManagerFileInfo fileInfo, Rectangle cellArea) { long percent = 0; long bytesDownloaded = fileInfo.getDownloaded(); long length = fileInfo.getLength(); if (cBGskipped == null) { cBGskipped = ColorCache.getSchemedColor(display, "#a6bdce"); } if (bytesDownloaded < 0) { return; } else if (length == 0) { percent = 1000; } else if (fileInfo.getLength() != 0) { percent = (1000 * bytesDownloaded) / length; } gc.setAdvanced(true); gc.setTextAntialias(SWT.ON); final int BUTTON_WIDTH = imgArrowButton.getBounds().width; final int HILOW_WIDTH = imgPriHi.getBounds().width; final int BUTTON_HEIGHT = imgArrowButton.getBounds().height; final int HILOW_HEIGHT = imgPriHi.getBounds().height; final int PADDING_X = 12; final int PADDING_TEXT = 5; final int PROGRESS_HEIGHT = imgBGfile.getBounds().height; final int PROGRESS_TO_HILOW_GAP = 3; final int HILOW_TO_BUTTON_GAP = 3; cellArea.width -= 3; int ofsX = PADDING_X; int ofsY = (cellArea.height / 2) - (PROGRESS_HEIGHT / 2) - 1; int progressWidth = cellArea.width - (ofsX * 2) - PROGRESS_TO_HILOW_GAP - HILOW_WIDTH - HILOW_TO_BUTTON_GAP - BUTTON_WIDTH; if ( progressWidth > 0 ){ if (progressFont == null) { progressFont = FontUtils.getFontWithHeight(gc.getFont(), gc, PROGRESS_HEIGHT - 2); } gc.setFont(progressFont); gc.setForeground(ColorCache.getSchemedColor(display, fileInfo.isSkipped() ? "#95a6b2" : "#88acc1")); gc.drawRectangle(cellArea.x + ofsX, cellArea.y + ofsY - 1, progressWidth, PROGRESS_HEIGHT + 1); int pctWidth = (int) (percent * (progressWidth - 1) / 1000); gc.setBackground(fileInfo.isSkipped() ? cBGskipped : percent == 1000 || fileInfo.getDownloadManager().isDownloadComplete(false) ? cBGcd : cBGdl); gc.fillRectangle(cellArea.x + ofsX + 1, cellArea.y + ofsY, pctWidth, PROGRESS_HEIGHT); gc.setBackground(Colors.white); gc.fillRectangle(cellArea.x + ofsX + pctWidth + 1, cellArea.y + ofsY, progressWidth - pctWidth - 1, PROGRESS_HEIGHT); Rectangle boundsImgBG = imgBGfile.getBounds(); gc.drawImage(imgBGfile, boundsImgBG.x, boundsImgBG.y, boundsImgBG.width, boundsImgBG.height, cellArea.x + ofsX + 1, cellArea.y + ofsY, progressWidth - 1, PROGRESS_HEIGHT); } Color colorText = ColorCache.getSchemedColor(display, fileInfo.isSkipped() ? "#556875" : "#2678b1"); Rectangle printBounds = new Rectangle( cellArea.x + PADDING_X + PADDING_TEXT, cellArea.y, progressWidth - (PADDING_TEXT * 2), cellArea.height); ofsY = (cellArea.height / 2) - (BUTTON_HEIGHT / 2) - 1; Rectangle buttonBounds = new Rectangle(cellArea.x + cellArea.width - BUTTON_WIDTH - PADDING_X, cellArea.y + ofsY, BUTTON_WIDTH, BUTTON_HEIGHT); row.setData("buttonBounds", buttonBounds); ofsY = (cellArea.height / 2) - (HILOW_HEIGHT / 2) - 1; Rectangle hilowBounds = new Rectangle(buttonBounds.x - HILOW_TO_BUTTON_GAP - HILOW_WIDTH, cellArea.y + ofsY, HILOW_WIDTH, HILOW_HEIGHT); row.setData("hilowBounds", hilowBounds); gc.setForeground(colorText); String s = DisplayFormatters.formatPercentFromThousands((int) percent); GCStringPrinter.printString(gc, s, printBounds, true, false, SWT.LEFT); //gc.setForeground(ColorCache.getRandomColor()); String tmp = null; if (fileInfo.getDownloadManager().getState() == DownloadManager.STATE_STOPPED) { tmp = MessageText.getString("FileProgress.stopped"); } else { int st = fileInfo.getStorageType(); if ((st == DiskManagerFileInfo.ST_COMPACT || st == DiskManagerFileInfo.ST_REORDER_COMPACT) && fileInfo.isSkipped()) { tmp = MessageText.getString("FileProgress.deleted"); } else if (fileInfo.isSkipped()) { tmp = MessageText.getString("FileProgress.stopped"); } else if (fileInfo.getPriority() > 0) { int pri = fileInfo.getPriority(); if (pri > 1) { tmp = MessageText.getString("FileItem.high"); tmp += " (" + pri + ")"; } } else { //tmp = MessageText.getString("FileItem.normal"); } } if (tmp != null) { GCStringPrinter.printString(gc, tmp.toUpperCase(), printBounds, false, false, SWT.RIGHT); } gc.drawImage(imgArrowButton, buttonBounds.x, buttonBounds.y); Image imgPriority = fileInfo.isSkipped() ? imgPriStopped : fileInfo.getPriority() > 0 ? imgPriHi : imgPriNormal; gc.drawImage(imgPriority, hilowBounds.x, hilowBounds.y); //System.out.println(cellArea + s + ";" + Debug.getCompressedStackTrace()); // make relative to row, because mouse events are hilowBounds.y -= cellArea.y; hilowBounds.x -= cellArea.x; buttonBounds.x -= cellArea.x; buttonBounds.y -= cellArea.y; } public void fileInfoMouseTrigger(TableCellMouseEvent event) { if (event.eventType != TableRowMouseEvent.EVENT_MOUSEDOWN) { return; } final Object dataSource = ((TableRowCore) event.row).getDataSource(true); if (dataSource instanceof DiskManagerFileInfo) { final DiskManagerFileInfo fileInfo = (DiskManagerFileInfo) dataSource; Rectangle hilowBounds = (Rectangle) event.row.getData("hilowBounds"); if (event.button == 1 && hilowBounds != null && hilowBounds.contains(event.x, event.y)) { if (fileInfo.getPriority() > 0) { fileInfo.setPriority(0); } else { fileInfo.setPriority(1); } ((TableRowCore) event.row).redraw(); } Rectangle buttonBounds = (Rectangle) event.row.getData("buttonBounds"); if (buttonBounds != null && buttonBounds.contains(event.x, event.y)) { Menu menu = new Menu(Display.getDefault().getActiveShell(), SWT.POP_UP); MenuItem itemHigh = new MenuItem(menu, SWT.RADIO); Messages.setLanguageText(itemHigh, "priority.high"); itemHigh.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { FilesViewMenuUtil.changePriority(FilesViewMenuUtil.PRIORITY_HIGH, new Object[] { dataSource }); } }); itemHigh.setSelection(fileInfo.getPriority() != 0); MenuItem itemNormal = new MenuItem(menu, SWT.RADIO); Messages.setLanguageText(itemNormal, "priority.normal"); itemNormal.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { FilesViewMenuUtil.changePriority(FilesViewMenuUtil.PRIORITY_NORMAL, new Object[] { dataSource }); } }); itemNormal.setSelection(fileInfo.getPriority() == 0); new MenuItem(menu, SWT.SEPARATOR); boolean canStart = fileInfo.isSkipped() || fileInfo.getDownloadManager().getState() == DownloadManager.STATE_STOPPED; MenuItem itemStop = new MenuItem(menu, SWT.PUSH); Messages.setLanguageText(itemStop, "v3.MainWindow.button.stop"); itemStop.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { FilesViewMenuUtil.changePriority( FilesViewMenuUtil.PRIORITY_SKIPPED, new Object[] { dataSource }); } }); itemStop.setEnabled(!canStart); MenuItem itemStart = new MenuItem(menu, SWT.PUSH); Messages.setLanguageText(itemStart, "v3.MainWindow.button.start"); itemStart.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if (fileInfo.getDownloadManager().getState() == DownloadManager.STATE_STOPPED) { TorrentUtil.queueDataSources(new Object[] { dataSource }, true); } FilesViewMenuUtil.changePriority(FilesViewMenuUtil.PRIORITY_NORMAL, new Object[] { dataSource }); } }); itemStart.setEnabled(canStart); new MenuItem(menu, SWT.SEPARATOR); MenuItem itemDelete = new MenuItem(menu, SWT.PUSH); Messages.setLanguageText(itemDelete, "v3.MainWindow.button.delete"); itemDelete.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { FilesViewMenuUtil.changePriority(FilesViewMenuUtil.PRIORITY_DELETE, new Object[] { dataSource }); } }); menu.setVisible(true); event.skipCoreFunctionality = true; } /* if (buttonBounds != null && buttonBounds.contains(event.x, event.y)) { int st = fileInfo.getStorageType(); if ((st == DiskManagerFileInfo.ST_COMPACT || st == DiskManagerFileInfo.ST_REORDER_COMPACT) && fileInfo.isSkipped()) { // deleted: Move to normal fileInfo.setPriority(0); fileInfo.setSkipped(false); } else if (fileInfo.isSkipped()) { // skipped: move to normal fileInfo.setPriority(0); fileInfo.setSkipped(false); } else if (fileInfo.getPriority() > 0) { // high: move to skipped fileInfo.setSkipped(true); } else { // normal: move to high fileInfo.setPriority(1); } //((TableRowCore) event.row).invalidate(); ((TableRowCore) event.row).redraw(); } */ } } }