package com.aelitis.azureus.ui.swt.subscriptions; import java.util.Arrays; import java.util.Comparator; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.gudy.azureus2.core3.config.COConfigurationManager; import org.gudy.azureus2.core3.download.DownloadManager; import org.gudy.azureus2.core3.internat.MessageText; import org.gudy.azureus2.core3.util.AEThread2; import org.gudy.azureus2.ui.swt.Utils; import org.gudy.azureus2.ui.swt.components.shell.ShellFactory; import com.aelitis.azureus.core.subs.Subscription; import com.aelitis.azureus.core.subs.SubscriptionAssociationLookup; import com.aelitis.azureus.core.subs.SubscriptionException; import com.aelitis.azureus.core.subs.SubscriptionLookupListener; import com.aelitis.azureus.core.subs.SubscriptionManager; import com.aelitis.azureus.core.subs.SubscriptionManagerFactory; import com.aelitis.azureus.core.subs.SubscriptionPopularityListener; import com.aelitis.azureus.ui.swt.widgets.AnimatedImage; public class SubscriptionListWindow implements SubscriptionLookupListener { private DownloadManager download; private boolean useCachedSubs; private Display display; private Shell shell; AnimatedImage animatedImage; Button action; Label loadingText; ProgressBar loadingProgress; boolean loadingDone = false; SubscriptionAssociationLookup lookup = null; Composite mainComposite; Composite loadingPanel; Composite listPanel; Table subscriptionsList; StackLayout mainLayout; private class SubscriptionItemModel { String name; long popularity; String popularityDisplay; Subscription subscription; boolean selected; } SubscriptionItemModel subscriptionItems[]; public SubscriptionListWindow(DownloadManager download, boolean useCachedSubs ) { this.download = download; this.useCachedSubs = useCachedSubs; shell = ShellFactory.createMainShell(SWT.TITLE); shell.setSize(400,300); Utils.centreWindow(shell); display = shell.getDisplay(); shell.setText(MessageText.getString("subscriptions.listwindow.title")); shell.setLayout(new FormLayout()); mainComposite = new Composite(shell,SWT.NONE); Label separator = new Label(shell,SWT.SEPARATOR | SWT.HORIZONTAL); Button cancel = new Button(shell,SWT.PUSH); action = new Button(shell,SWT.PUSH); cancel.setText(MessageText.getString("Button.cancel")); FormData data; data = new FormData(); data.left = new FormAttachment(0,0); data.right = new FormAttachment(100,0); data.top = new FormAttachment(0,0); data.bottom = new FormAttachment(separator,0); mainComposite.setLayoutData(data); data = new FormData(); data.left = new FormAttachment(0,0); data.right = new FormAttachment(100,0); data.bottom = new FormAttachment(cancel,-2); separator.setLayoutData(data); data = new FormData(); data.right = new FormAttachment(action); data.width = 100; data.bottom = new FormAttachment(100,-5); cancel.setLayoutData(data); data = new FormData(); data.right = new FormAttachment(100,-5); data.width = 100; data.bottom = new FormAttachment(100,-5); action.setLayoutData(data); cancel.addListener(SWT.Selection, new Listener() { public void handleEvent(Event arg0) { if(lookup != null) { lookup.cancel(); } if(!shell.isDisposed()) { shell.dispose(); } } }); mainLayout = new StackLayout(); mainComposite.setLayout(mainLayout); loadingPanel = new Composite(mainComposite,SWT.NONE); loadingPanel.setLayout(new FormLayout()); listPanel = new Composite(mainComposite,SWT.NONE); listPanel.setLayout(new FillLayout()); subscriptionsList = new Table(listPanel,SWT.V_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION | SWT.VIRTUAL); subscriptionsList.setHeaderVisible(true); TableColumn name = new TableColumn(subscriptionsList,SWT.NONE); name.setText(MessageText.getString("subscriptions.listwindow.name")); name.setWidth(310); name.setResizable(false); TableColumn popularity = new TableColumn(subscriptionsList,SWT.NONE); popularity.setText(MessageText.getString("subscriptions.listwindow.popularity")); popularity.setWidth(70); popularity.setResizable(false); subscriptionsList.addListener(SWT.SetData, new Listener() { public void handleEvent(Event e) { TableItem item = (TableItem) e.item; int index = subscriptionsList.indexOf(item); if(index >= 0 && index < subscriptionItems.length) { SubscriptionItemModel subscriptionItem = subscriptionItems[index]; item.setText(0,subscriptionItem.name); item.setText(1,subscriptionItem.popularityDisplay); } } }); subscriptionsList.setSortColumn(popularity); subscriptionsList.setSortDirection(SWT.DOWN); subscriptionsList.addListener(SWT.Selection, new Listener() { public void handleEvent(Event arg0) { action.setEnabled(subscriptionsList.getSelectionIndex() != -1); } }); Listener sortListener = new Listener() { public void handleEvent(Event e) { // determine new sort column and direction TableColumn sortColumn = subscriptionsList.getSortColumn(); TableColumn currentColumn = (TableColumn) e.widget; int dir = subscriptionsList.getSortDirection(); if (sortColumn == currentColumn) { dir = dir == SWT.UP ? SWT.DOWN : SWT.UP; } else { subscriptionsList.setSortColumn(currentColumn); dir = SWT.DOWN; } subscriptionsList.setSortDirection(dir); sortAndRefresh(); } }; name.addListener(SWT.Selection, sortListener); popularity.addListener(SWT.Selection, sortListener); animatedImage = new AnimatedImage(loadingPanel); loadingText = new Label(loadingPanel,SWT.WRAP | SWT.CENTER); loadingProgress = new ProgressBar(loadingPanel,SWT.HORIZONTAL); animatedImage.setImageFromName("spinner_big"); String contentName = "Dummy"; if(download != null) { contentName = download.getDisplayName(); } loadingText.setText(MessageText.getString("subscriptions.listwindow.loadingtext", new String[] {contentName})); loadingProgress.setMinimum(0); loadingProgress.setMaximum(300); loadingProgress.setSelection(0); data = new FormData(); data.left = new FormAttachment(1,2,-16); data.top = new FormAttachment(1,2,-32); data.width = 32; data.height = 32; animatedImage.setLayoutData(data); data = new FormData(); data.left = new FormAttachment(0,5); data.right = new FormAttachment(100,-5); data.top = new FormAttachment(animatedImage.getControl(),10); data.height = 50; loadingText.setLayoutData(data); data = new FormData(); data.left = new FormAttachment(0,5); data.right = new FormAttachment(100,-5); data.top = new FormAttachment(loadingText,5); loadingProgress.setLayoutData(data); boolean autoCheck = COConfigurationManager.getBooleanParameter("subscriptions.autocheck"); if(autoCheck) { startChecking(); } else { action.setText(MessageText.getString("Button.yes")); Composite acceptPanel = new Composite(mainComposite,SWT.NONE); acceptPanel.setLayout(new FormLayout()); Label acceptLabel = new Label(acceptPanel,SWT.WRAP | SWT.CENTER); acceptLabel.setText(MessageText.getString("subscriptions.listwindow.autochecktext")); data = new FormData(); data.left = new FormAttachment(0,5); data.right = new FormAttachment(100,-5); data.top = new FormAttachment(1,3,0); acceptLabel.setLayoutData(data); action.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { action.removeListener(SWT.Selection,this); COConfigurationManager.setParameter("subscriptions.autocheck",true); startChecking(); mainComposite.layout(); } }); mainLayout.topControl = acceptPanel; } //shell.setSize(400,300); shell.open(); } private void startChecking() { action.setText(MessageText.getString("subscriptions.listwindow.subscribe")); action.setEnabled(false); try { if(download != null) { byte[] hash = download.getTorrent().getHash(); SubscriptionManager subs_man = SubscriptionManagerFactory.getSingleton(); if ( useCachedSubs ){ Subscription[] subs = subs_man.getKnownSubscriptions( hash ); complete(hash,subs); }else{ lookup = subs_man.lookupAssociations(hash, this); } } else { } loadingDone = false; AEThread2 progressMover = new AEThread2("progressMover",true) { public void run() { final int[] waitTime = new int[1]; waitTime[0]= 100; while(!loadingDone) { if(display != null && ! display.isDisposed()) { display.asyncExec(new Runnable() { public void run() { if(loadingProgress != null && !loadingProgress.isDisposed()) { int currentSelection = loadingProgress.getSelection() +1; loadingProgress.setSelection(currentSelection); if(currentSelection > (loadingProgress.getMaximum()) * 80 / 100) { waitTime[0] = 300; } if (currentSelection > (loadingProgress.getMaximum()) * 90 / 100) { waitTime[0] = 1000; } } else { loadingDone = true; } } }); } try { Thread.sleep(waitTime[0]); //Thread.sleep(100); } catch (Exception e) { loadingDone = true; } } } }; progressMover.start(); } catch(Exception e) { failed(null,null); } animatedImage.start(); mainLayout.topControl = loadingPanel; } /*private void populateSubscription(final Subscription subscription) { final TableItem item = new TableItem(subscriptionsList,SWT.NONE); item.setData("subscription",subscription); item.setText(0,subscription.getName()); try { item.setText(1,MessageText.getString("subscriptions.listwindow.popularity.reading")); action.setEnabled(true); }*/ public void found(byte[] hash, Subscription subscription) { // TODO Auto-generated method stub } public void complete(final byte[] hash,final Subscription[] subscriptions) { if( ! (subscriptions.length > 0) ) { failed(hash, null); } else { subscriptionItems = new SubscriptionItemModel[subscriptions.length]; for(int i = 0 ; i < subscriptions.length ; i++) { final SubscriptionItemModel subscriptionItem = new SubscriptionItemModel(); subscriptionItems[i] = subscriptionItem; subscriptionItem.name = subscriptions[i].getName(); subscriptionItem.popularity = -1; subscriptionItem.popularityDisplay = MessageText.getString("subscriptions.listwindow.popularity.reading"); subscriptionItem.subscription = subscriptions[i]; try { subscriptions[i].getPopularity( new SubscriptionPopularityListener() { public void gotPopularity( long popularity ) { update(subscriptionItem,popularity, popularity + "" ); } public void failed( SubscriptionException error ) { update(subscriptionItem,-2,MessageText.getString("subscriptions.listwindow.popularity.unknown")); } }); } catch(SubscriptionException e) { update(subscriptionItem,-2,MessageText.getString("subscriptions.listwindow.popularity.unknown")); } } if(display != null && !display.isDisposed()) { display.asyncExec(new Runnable() { public void run() { animatedImage.stop(); mainLayout.topControl = listPanel; mainComposite.layout(); sortAndRefresh(); subscriptionsList.setSelection(0); action.addListener(SWT.Selection, new Listener() { public void handleEvent(Event arg0) { if(subscriptionsList != null && !subscriptionsList.isDisposed()) { int selectedIndex = subscriptionsList.getSelectionIndex(); if(selectedIndex >= 0 && selectedIndex < subscriptionItems.length) { Subscription subscription = (Subscription) subscriptionItems[selectedIndex].subscription; if(subscription != null) { subscription.setSubscribed(true); } } } } }); } }); } } } protected void update( final SubscriptionItemModel subscriptionItem, final long popularity, final String text ) { subscriptionItem.popularity = popularity; subscriptionItem.popularityDisplay = text; display.asyncExec( new Runnable() { public void run() { sortAndRefresh(); } }); } private void sortAndRefresh() { if ( subscriptionsList.isDisposed()){ return; } for(int i = 0 ; i < subscriptionItems.length ; i++) { subscriptionItems[i].selected = false; } int currentSelection = subscriptionsList.getSelectionIndex(); if(currentSelection >= 0 && currentSelection < subscriptionItems.length) { subscriptionItems[currentSelection].selected = true; } final int dir = subscriptionsList.getSortDirection() == SWT.DOWN ? 1 : -1; final boolean nameSort = subscriptionsList.getColumn(0) == subscriptionsList.getSortColumn(); Arrays.sort(subscriptionItems,new Comparator() { public int compare(Object arg0, Object arg1) { SubscriptionItemModel item0 = (SubscriptionItemModel) arg0; SubscriptionItemModel item1 = (SubscriptionItemModel) arg1; if(nameSort) { return dir * item0.name.compareTo(item1.name); } else { return dir * (int) (item1.popularity - item0.popularity); } } }); subscriptionsList.setItemCount(subscriptionItems.length); subscriptionsList.clearAll(); if(currentSelection >= 0 && currentSelection < subscriptionItems.length) { for(int i = 0 ; i < subscriptionItems.length ; i++) { if(subscriptionItems[i].selected) { subscriptionsList.setSelection(i); } } } } public void failed(byte[] hash,SubscriptionException error) { if(display != null && !display.isDisposed()) { display.asyncExec(new Runnable() { public void run() { animatedImage.stop(); animatedImage.dispose(); loadingProgress.dispose(); loadingText.setText(MessageText.getString("subscriptions.listwindow.failed")); } }); } } public static void main(String[] args) { Display display = new Display(); SubscriptionListWindow slw = new SubscriptionListWindow(null,false); while(!slw.shell.isDisposed()) { if(!display.readAndDispatch()) { display.sleep(); } } } }