/* * Created on 16-Jan-2006 * Created by Paul Gardner * Copyright (C) 2006 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 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.net.URL; import java.util.*; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; import org.gudy.azureus2.core3.download.DownloadManager; import org.gudy.azureus2.core3.internat.LocaleTorrentUtil; import org.gudy.azureus2.core3.internat.MessageText; import org.gudy.azureus2.core3.torrent.TOTorrent; import org.gudy.azureus2.core3.torrent.TOTorrentAnnounceURLGroup; import org.gudy.azureus2.core3.torrent.TOTorrentAnnounceURLSet; import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncer; import org.gudy.azureus2.core3.tracker.client.TRTrackerScraperResponse; import org.gudy.azureus2.core3.util.AERunnable; import org.gudy.azureus2.core3.util.Debug; import org.gudy.azureus2.plugins.download.DownloadTypeComplete; import org.gudy.azureus2.plugins.download.DownloadTypeIncomplete; import org.gudy.azureus2.plugins.ui.UIPluginViewToolBarListener; import org.gudy.azureus2.plugins.ui.tables.TableManager; import org.gudy.azureus2.ui.swt.Messages; import org.gudy.azureus2.ui.swt.Utils; import org.gudy.azureus2.ui.swt.components.BufferedLabel; 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 org.gudy.azureus2.ui.swt.views.table.impl.FakeTableCell; import com.aelitis.azureus.ui.common.ToolBarItem; import com.aelitis.azureus.ui.common.table.TableCellCore; import com.aelitis.azureus.ui.common.table.TableColumnCore; import com.aelitis.azureus.ui.common.table.impl.TableColumnManager; import com.aelitis.azureus.ui.selectedcontent.SelectedContent; import com.aelitis.azureus.ui.selectedcontent.SelectedContentManager; public class TorrentInfoView implements UISWTViewCoreEventListener, UIPluginViewToolBarListener { public static final String MSGID_PREFIX = "TorrentInfoView"; private DownloadManager download_manager; private Composite outer_panel; private Font headerFont; private FakeTableCell[] cells; private ScrolledComposite sc; private Composite parent; private UISWTView swtView; private void initialize( Composite composite) { this.parent = composite; if (download_manager == null) { return; } // cheap trick to allow datasource changes. Normally we'd just // refill the components with new info, but I didn't write this and // I don't want to waste my time :) [tux] if (sc != null && !sc.isDisposed()) { sc.dispose(); } sc = new ScrolledComposite(composite, SWT.V_SCROLL | SWT.H_SCROLL ); sc.getVerticalBar().setIncrement(16); sc.setExpandHorizontal(true); sc.setExpandVertical(true); GridData gridData = new GridData(GridData.FILL, GridData.FILL, true, true, 1, 1); sc.setLayoutData(gridData); outer_panel = sc; Composite panel = new Composite(sc, SWT.NULL); sc.setContent( panel ); GridLayout layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; layout.numColumns = 1; panel.setLayout(layout); //int userMode = COConfigurationManager.getIntParameter("User Mode"); // header Composite cHeader = new Composite(panel, SWT.BORDER); GridLayout configLayout = new GridLayout(); configLayout.marginHeight = 3; configLayout.marginWidth = 0; cHeader.setLayout(configLayout); gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER); cHeader.setLayoutData(gridData); Display d = panel.getDisplay(); cHeader.setBackground(d.getSystemColor(SWT.COLOR_LIST_SELECTION)); cHeader.setForeground(d.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT)); Label lHeader = new Label(cHeader, SWT.NULL); lHeader.setBackground(d.getSystemColor(SWT.COLOR_LIST_SELECTION)); lHeader.setForeground(d.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT)); FontData[] fontData = lHeader.getFont().getFontData(); fontData[0].setStyle(SWT.BOLD); int fontHeight = (int)(fontData[0].getHeight() * 1.2); fontData[0].setHeight(fontHeight); headerFont = new Font(d, fontData); lHeader.setFont(headerFont); lHeader.setText( " " + MessageText.getString( "authenticator.torrent" ) + " : " + download_manager.getDisplayName().replaceAll("&", "&&")); gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER); lHeader.setLayoutData(gridData); Composite gTorrentInfo = new Composite(panel, SWT.NULL); gridData = new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL); gTorrentInfo.setLayoutData(gridData); layout = new GridLayout(); layout.numColumns = 2; gTorrentInfo.setLayout(layout); // torrent encoding Label label = new Label(gTorrentInfo, SWT.NULL); gridData = new GridData(); label.setLayoutData( gridData ); label.setText( MessageText.getString( MSGID_PREFIX + ".torrent.encoding" ) + ": " ); TOTorrent torrent = download_manager.getTorrent(); BufferedLabel blabel = new BufferedLabel(gTorrentInfo, SWT.NULL); gridData = new GridData(); blabel.setLayoutData( gridData ); blabel.setText(torrent==null?"":LocaleTorrentUtil.getCurrentTorrentEncoding( torrent )); // trackers label = new Label(gTorrentInfo, SWT.NULL); gridData = new GridData(); label.setLayoutData( gridData ); label.setText( MessageText.getString( "MyTrackerView.tracker" ) + ": " ); String trackers = ""; if ( torrent != null ){ TOTorrentAnnounceURLGroup group = torrent.getAnnounceURLGroup(); TOTorrentAnnounceURLSet[] sets = group.getAnnounceURLSets(); List<String> tracker_list = new ArrayList<String>(); URL url = torrent.getAnnounceURL(); tracker_list.add( url.getHost() + (url.getPort()==-1?"":(":"+url.getPort()))); for (int i=0;i<sets.length;i++){ TOTorrentAnnounceURLSet set = sets[i]; URL[] urls = set.getAnnounceURLs(); for (int j=0;j<urls.length;j++){ url = urls[j]; String str = url.getHost() + (url.getPort()==-1?"":(":"+url.getPort())); if ( !tracker_list.contains(str )){ tracker_list.add(str); } } } TRTrackerAnnouncer announcer = download_manager.getTrackerClient(); URL active_url = null; if ( announcer != null ){ active_url = announcer.getTrackerURL(); }else{ TRTrackerScraperResponse scrape = download_manager.getTrackerScrapeResponse(); if ( scrape != null ){ active_url = scrape.getURL(); } } if ( active_url == null ){ active_url = torrent.getAnnounceURL(); } trackers = active_url.getHost() + (active_url.getPort()==-1?"":(":"+active_url.getPort())); tracker_list.remove( trackers ); if ( tracker_list.size() > 0 ){ trackers += " ("; for (int i=0;i<tracker_list.size();i++){ trackers += (i==0?"":", ") + tracker_list.get(i); } trackers += ")"; } } blabel = new BufferedLabel(gTorrentInfo, SWT.WRAP); blabel.setLayoutData(Utils.getWrappableLabelGridData(1, GridData.FILL_HORIZONTAL)); blabel.setText( trackers ); // columns Group gColumns = new Group(panel, SWT.NULL); Messages.setLanguageText(gColumns, MSGID_PREFIX + ".columns" ); gridData = new GridData(GridData.FILL_BOTH); gColumns.setLayoutData(gridData); layout = new GridLayout(); layout.numColumns = 4; gColumns.setLayout(layout); Map<String, FakeTableCell> usable_cols = new HashMap<String, FakeTableCell>(); TableColumnManager col_man = TableColumnManager.getInstance(); TableColumnCore[][] cols_sets = { col_man.getAllTableColumnCoreAsArray(DownloadTypeIncomplete.class, TableManager.TABLE_MYTORRENTS_INCOMPLETE), col_man.getAllTableColumnCoreAsArray(DownloadTypeComplete.class, TableManager.TABLE_MYTORRENTS_COMPLETE), }; for (int i=0;i<cols_sets.length;i++){ TableColumnCore[] cols = cols_sets[i]; for (int j=0;j<cols.length;j++){ TableColumnCore col = cols[j]; String id = col.getName(); if (usable_cols.containsKey(id)) { continue; } FakeTableCell fakeTableCell = null; try { fakeTableCell = new FakeTableCell(col, download_manager); fakeTableCell.setOrentation(SWT.LEFT); fakeTableCell.setWrapText(false); col.invokeCellAddedListeners(fakeTableCell); // One refresh to see if it throws up fakeTableCell.refresh(); usable_cols.put(id, fakeTableCell); } catch (Throwable t) { //System.out.println("not usable col: " + id + " - " + Debug.getCompressedStackTrace()); try { if (fakeTableCell != null) { fakeTableCell.dispose(); } } catch (Throwable t2) { //ignore; } } } } Collection<FakeTableCell> values = usable_cols.values(); cells = new FakeTableCell[values.size()]; values.toArray( cells ); Arrays.sort( cells, new Comparator<FakeTableCell>() { public int compare(FakeTableCell o1, FakeTableCell o2) { TableColumnCore c1 = (TableColumnCore) o1.getTableColumn(); TableColumnCore c2 = (TableColumnCore) o2.getTableColumn(); String key1 = MessageText.getString(c1.getTitleLanguageKey()); String key2 = MessageText.getString(c2.getTitleLanguageKey()); return key1.compareToIgnoreCase(key2); } }); for (int i=0;i<cells.length;i++){ final FakeTableCell cell = cells[i]; label = new Label(gColumns, SWT.NULL); gridData = new GridData(); if ( i%2 == 1 ){ gridData.horizontalIndent = 16; } label.setLayoutData( gridData ); String key = ((TableColumnCore) cell.getTableColumn()).getTitleLanguageKey(); label.setText(MessageText.getString(key) + ": "); label.setToolTipText(MessageText.getString(key + ".info", "")); final Composite c = new Composite(gColumns, SWT.DOUBLE_BUFFERED); gridData = new GridData( GridData.FILL_HORIZONTAL); gridData.heightHint = 16; c.setLayoutData(gridData); cell.setControl(c); cell.invalidate(); cell.refresh(); c.addListener(SWT.MouseHover, new Listener() { public void handleEvent(Event event) { Object toolTip = cell.getToolTip(); if (toolTip instanceof String) { String s = (String) toolTip; c.setToolTipText(s); } } }); } refresh(); sc.setMinSize( panel.computeSize( SWT.DEFAULT, SWT.DEFAULT )); } private void refresh() { if ( cells != null ){ for (int i=0;i<cells.length;i++){ TableCellCore cell = cells[i]; try {cell.refresh();} catch (Exception e) {Debug.printStackTrace(e, "Error refreshing cell: " + cells[i].getTableColumn().getName());} } } } private Composite getComposite() { return outer_panel; } private String getFullTitle() { return MessageText.getString("TorrentInfoView.title.full"); } private void delete() { if ( headerFont != null ){ headerFont.dispose(); } if ( cells != null ){ for (int i=0;i<cells.length;i++){ TableCellCore cell = cells[i]; cell.dispose(); } } } private void dataSourceChanged(Object newDataSource) { if (newDataSource instanceof DownloadManager) { download_manager = (DownloadManager) newDataSource; } Utils.execSWTThread(new AERunnable() { public void runSupport() { if (parent != null) { initialize(parent); } } }); } public boolean eventOccurred(UISWTViewEvent event) { switch (event.getType()) { case UISWTViewEvent.TYPE_CREATE: swtView = (UISWTView)event.getData(); swtView.setTitle(getFullTitle()); swtView.setToolBarListener(this); 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: String id = "DMDetails_Info"; if (download_manager != null) { if (download_manager.getTorrent() != null) { id += "." + download_manager.getInternalName(); } else { id += ":" + download_manager.getSize(); } } SelectedContentManager.changeCurrentlySelectedContent(id, new SelectedContent[] { new SelectedContent(download_manager) }); break; case UISWTViewEvent.TYPE_REFRESH: refresh(); break; } return true; } public boolean toolBarItemActivated(ToolBarItem item, long activationType, Object datasource) { return( ViewUtils.toolBarItemActivated(download_manager, item, activationType, datasource)); } public void refreshToolBarItems(Map<String, Long> list) { ViewUtils.refreshToolBarItems(download_manager, list); } }