Package com.aelitis.azureus.ui.swt.subscriptions

Source Code of com.aelitis.azureus.ui.swt.subscriptions.SubscriptionListWindow

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();
      }
    }
  }

}
TOP

Related Classes of com.aelitis.azureus.ui.swt.subscriptions.SubscriptionListWindow

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.