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

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

package com.aelitis.azureus.ui.swt.subscriptions;

import java.net.URL;
import java.util.*;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

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.ByteFormatter;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.components.CustomTableTooltipHandler;
import org.gudy.azureus2.ui.swt.components.shell.ShellFactory;

import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.AzureusCoreRunningListener;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.subs.*;
import com.aelitis.azureus.core.subs.SubscriptionUtils.SubscriptionDownloadDetails;
import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.mdi.MultipleDocumentInterface;
import com.aelitis.azureus.ui.swt.imageloader.ImageLoader;
import com.aelitis.azureus.ui.swt.shells.main.MainWindow;
import com.aelitis.azureus.ui.swt.utils.ColorCache;

public class SubscriptionWizard {
 
  private static final int MODE_OPT_IN = 1;
  private static final int MODE_SUBSCRIBE = 2;
  private static final int MODE_CREATE_SEARCH = 3;
  private static final int MODE_CREATE_RSS = 4;
 
  private static final int RANK_COLUMN_WIDTH = 85;
 
  private final String TITLE_OPT_IN = MessageText.getString("Wizard.Subscription.optin.title");
  private final String TITLE_SUBSCRIBE = MessageText.getString("Wizard.Subscription.subscribe.title");
  private final String TITLE_CREATE = MessageText.getString("Wizard.Subscription.create.title");
 
  Display display;
  Shell shell;
 
  Image rankingBars;
  Color rankingBorderColor;
 
  Label title;
 
  Button cancelButton;
  Button searchButton;
  Button saveButton;
  Button yesButton;
  Button addButton;
  Button availableButton;
  Button createButton;
 
  Font boldFont;
  Font titleFont;
  Font subTitleFont;
  Font textInputFont;
 
 
  Composite main;
  StackLayout mainLayout;
  Composite optinComposite;
  Composite subscribeComposite;
  Composite createComposite;
  TabFolder createTabFolder;
  TabItem   createRSSTabItem;
  TabItem   createSearchTabItem;
  Composite availableSubscriptionComposite;
 
  Table libraryTable;
  Listener rssSaveListener;
  Listener searchListener;
 
  Text searchInput;
  Text feedUrl;
 
 
  SubscriptionDownloadDetails[] availableSubscriptions;
  Subscription[] subscriptions;
 
  DownloadManager download;
  private ImageLoader imageLoader;
 
  public SubscriptionWizard() {
    this(null);
  }
 
  public SubscriptionWizard(final DownloadManager download) {
    AzureusCoreFactory.addCoreRunningListener(new AzureusCoreRunningListener() {
      public void azureusCoreRunning(AzureusCore core) {
        init(core, download);
      }
    });
  }

  protected void init(AzureusCore core, DownloadManager download) {
    imageLoader = ImageLoader.getInstance();

    this.download = download;
   
    /*SubscriptionDownloadDetails[] allSubscriptions = SubscriptionUtils.getAllCachedDownloadDetails();
    List notYetSubscribed = new ArrayList(allSubscriptions.length);
    for(int i = 0 ; i < allSubscriptions.length ; i++) {
      Subscription[] subs = allSubscriptions[i].getSubscriptions();
      boolean subscribedToAll = true;
      for(int j = 0 ; j < subs.length ; j++) {
        subscribedToAll = subscribedToAll && subs[j].isSubscribed();
      }
      if(!subscribedToAll) {
        notYetSubscribed.add(allSubscriptions[i]);
      }
    }
    availableSubscriptions = (SubscriptionDownloadDetails[]) notYetSubscribed.toArray(new SubscriptionDownloadDetails[notYetSubscribed.size()]);*/
    availableSubscriptions = SubscriptionUtils.getAllCachedDownloadDetails(core);
    Arrays.sort(availableSubscriptions,new Comparator() {
      public int compare(Object o1, Object o2) {
        if(! (o1 instanceof SubscriptionDownloadDetails && o2 instanceof SubscriptionDownloadDetails)) return 0;
        SubscriptionDownloadDetails sub1 = (SubscriptionDownloadDetails) o1;
        SubscriptionDownloadDetails sub2 = (SubscriptionDownloadDetails) o2;
        return sub1.getDownload().getDisplayName().compareTo(sub2.getDownload().getDisplayName());
      }
    });
   
   
    shell = ShellFactory.createMainShell(SWT.TITLE | SWT.CLOSE | SWT.RESIZE);
    shell.setSize(650,400);
    Utils.centreWindow(shell);
   
    shell.setMinimumSize(550,400);
   
    display = shell.getDisplay();
   
    Utils.setShellIcon(shell);
   
    rankingBars = imageLoader.getImage("ranking_bars");
    rankingBorderColor = new Color(display,200,200,200);
   
    createFonts();
   
    shell.setText(MessageText.getString("Wizard.Subscription.title"));
   
    shell.addListener(SWT.Dispose, new Listener() {
      public void handleEvent(Event event) {
        imageLoader.releaseImage("ranking_bars");
        imageLoader.releaseImage("wizard_header_bg");
        imageLoader.releaseImage("icon_rss");
       
        if(titleFont != null && !titleFont.isDisposed()) {
          titleFont.dispose();
        }
       
        if(textInputFont != null && !textInputFont.isDisposed()) {
          textInputFont.dispose();
        }
       
        if(boldFont != null && !boldFont.isDisposed()) {
          boldFont.dispose();
        }
       
        if(subTitleFont != null && !subTitleFont.isDisposed()) {
          subTitleFont.dispose();
        }
       
        if(rankingBorderColor != null && !rankingBorderColor.isDisposed()) {
          rankingBorderColor.dispose();
        }
       
      }
    });
   
    Composite header = new Composite(shell, SWT.NONE);
    header.setBackgroundMode(SWT.INHERIT_DEFAULT);
    header.setBackgroundImage(imageLoader.getImage("wizard_header_bg"));
    Label topSeparator = new Label(shell,SWT.SEPARATOR |SWT.HORIZONTAL);
    main = new Composite(shell, SWT.NONE);
    Label bottomSeparator = new Label(shell,SWT.SEPARATOR |SWT.HORIZONTAL);
    Composite footer = new Composite(shell, SWT.NONE);
   
    FormLayout layout = new FormLayout();
    shell.setLayout(layout);
   
    FormData data;
   
    data = new FormData();
    data.top = new FormAttachment(0,0);
    data.left = new FormAttachment(0,0);
    data.right = new FormAttachment(100,0);
    //data.height = 50;
    header.setLayoutData(data);
   
    data = new FormData();
    data.top = new FormAttachment(header,0);
    data.left = new FormAttachment(0,0);
    data.right = new FormAttachment(100,0);
    topSeparator.setLayoutData(data);
   
    data = new FormData();
    data.top = new FormAttachment(topSeparator,0);
    data.left = new FormAttachment(0,0);
    data.right = new FormAttachment(100,0);
    data.bottom = new FormAttachment(bottomSeparator,0);
    main.setLayoutData(data);
   
    data = new FormData();
    data.left = new FormAttachment(0,0);
    data.right = new FormAttachment(100,0);
    data.bottom = new FormAttachment(footer,0);
    bottomSeparator.setLayoutData(data);
   
    data = new FormData();
    data.bottom = new FormAttachment(100,0);
    data.left = new FormAttachment(0,0);
    data.right = new FormAttachment(100,0);
    //data.height = 100;
    footer.setLayoutData(data);
   
    populateHeader(header);
    populateFooter(footer);
   
    mainLayout = new StackLayout();
    main.setLayout(mainLayout);
   
    optinComposite = createOptInComposite(main);
    createComposite = createCreateComposite(main);
    availableSubscriptionComposite = createAvailableSubscriptionComposite(main);
   
   
    setDefaultAvailableMode();
   
    shell.layout();
    shell.open();
   
    setInitialViews();
  }
 
  protected void
  setInitialViews()
  {
    if ( availableSubscriptions != null ){
     
      for (int i=0;i<availableSubscriptions.length;i++){
       
        SubscriptionDownloadDetails details = availableSubscriptions[i];
       
        if ( details.getDownload()== download ){
           
          final int f_i = i;
         
          Utils.execSWTThread(
            new Runnable()
            {
              public void
              run()
              { 
                libraryTable.setTopIndex( f_i );
              }
            });
        }
      }
    }
  }
  private void populateHeader(Composite header) {
    header.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
    title = new Label(header, SWT.WRAP);
   
    title.setFont(titleFont);
   
    FillLayout layout = new FillLayout();
    layout.marginHeight = 10;
    layout.marginWidth = 10;
    header.setLayout(layout);
   
  }
 
  private Composite createOptInComposite(Composite parent) {
    Composite composite = new Composite(parent,SWT.NONE);
    composite.setBackgroundMode(SWT.INHERIT_FORCE);
   
    Label description = new Label(composite,SWT.WRAP);
    description.setFont(boldFont);
    description.setText(MessageText.getString("Wizard.Subscription.optin.description"));
   
    /*Label descLibraryIcon = new Label(composite, SWT.NONE);
    descLibraryIcon.setImage(ImageRepository.getImage("btn_rss_add"));
   
    Label descLibraryText = new Label(composite, SWT.NONE);
    descLibraryText.setText(MessageText.getString("Wizard.Subscription.optin.description.library"));
   
    Label descSidebarIcon = new Label(composite, SWT.NONE);
    descSidebarIcon.setImage(ImageRepository.getImage("btn_sidebar_add"));
   
    Label descSidebarText = new Label(composite, SWT.NONE);
    descSidebarText.setText(MessageText.getString("Wizard.Subscription.optin.description.sidebar"));
   
    Label help = new Label(composite, SWT.NONE);
    help.setFont(boldFont);
    help.setText(MessageText.getString("Wizard.Subscription.optin.help"));*/
   
    FormLayout layout = new FormLayout();
    composite.setLayout(layout);
   
    FormData data;
   
    data = new FormData();
    data.top = new FormAttachment(0,40);
    data.left = new FormAttachment(0,50);
    data.right= new FormAttachment(100,-50);
    description.setLayoutData(data);
   
    /*data = new FormData();
    data.top = new FormAttachment(description,10);
    data.left = new FormAttachment(0,50);
    descLibraryIcon.setLayoutData(data);
   
    data = new FormData();
    //data.top = new FormAttachment(description,10);
    data.left = new FormAttachment(descLibraryIcon,10);
    data.right= new FormAttachment(100,-50);
    data.bottom= new FormAttachment(descLibraryIcon,-3,SWT.BOTTOM);
    descLibraryText.setLayoutData(data);
   
    data = new FormData();
    data.top = new FormAttachment(descLibraryText,10);
    //data.left = new FormAttachment(descLibraryIcon,-10,SWT.CENTER);
    data.left = new FormAttachment(0,50);
    descSidebarIcon.setLayoutData(data);
   
    data = new FormData();
    //data.top = new FormAttachment(descLibraryText,10);
    data.left = new FormAttachment(descLibraryText,0,SWT.LEFT);
    data.right= new FormAttachment(100);
    data.bottom= new FormAttachment(descSidebarIcon,-3,SWT.BOTTOM);
    descSidebarText.setLayoutData(data);
   
    data = new FormData();
    data.right= new FormAttachment(100,-20);
    data.bottom= new FormAttachment(100,-10);
    help.setLayoutData(data);*/
   
    return composite;
  }
 
  private Composite createCreateComposite(Composite parent) {
    Composite composite = new Composite(parent,SWT.NONE);
   
    FillLayout layout = new FillLayout();
    layout.marginHeight = 8;
    layout.marginWidth  = 8;
   
    composite.setLayout(layout);
   
    createTabFolder = new TabFolder(composite,SWT.NONE);
    createTabFolder.setFont(subTitleFont);
   
    createSearchTabItem = new TabItem(createTabFolder,SWT.NONE);
    createSearchTabItem.setText(MessageText.getString("Wizard.Subscription.create.search"));
    createSearchTabItem.setControl(createCreateSearchComposite(createTabFolder));
   
    createRSSTabItem = new TabItem(createTabFolder,SWT.NONE);
    createRSSTabItem.setText("  " + MessageText.getString("Wizard.Subscription.create.rss"));
    createRSSTabItem.setControl(createCreateRSSComposite(createTabFolder));
   
    createTabFolder.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {
        TabItem[] selectedItems = createTabFolder.getSelection();
        if(selectedItems.length != 1) {
          return;
        }
        TabItem selectedItem = selectedItems[0];
        if(selectedItem == createRSSTabItem) {
          setMode(MODE_CREATE_RSS);
        } else {
          setMode(MODE_CREATE_SEARCH);
        }
      }
    });
   
    return composite;
  }
 
  private Composite createCreateRSSComposite(Composite parent) {
    Composite composite = new Composite(parent,SWT.NONE);

    Label subTitle1 = new Label(composite,SWT.WRAP);
    subTitle1.setFont(subTitleFont);
    subTitle1.setText(MessageText.getString("Wizard.Subscription.rss.subtitle1"));
   
    feedUrl = new Text(composite, SWT.SINGLE);
    feedUrl.setFont(textInputFont);
    feedUrl.setText("http://");
//    feedUrl.setData("visited",new Boolean(false));
//   
//    feedUrl.addListener(SWT.FocusIn, new Listener() {
//      public void handleEvent(Event arg0) {
//        boolean visited = ((Boolean) feedUrl.getData("visited")).booleanValue();
//        if(visited) return;
//        feedUrl.setData("visited",new Boolean(true));
//        feedUrl.setText("");
//      }
//    });
   
    feedUrl.addListener (SWT.DefaultSelection, rssSaveListener);
   
    feedUrl.addListener(SWT.Modify, new Listener() {
      public void handleEvent(Event event) {
        boolean valid_url = false;
        try {
          URL url = new URL(feedUrl.getText());
          String protocol = url.getProtocol().toLowerCase();
          valid_url = protocol.equals( "azplug" ) || protocol.equals( "file") || url.getHost().trim().length() > 0;
        } catch (Exception e) {}
       
        saveButton.setEnabled(valid_url);
      }
    });
   
    Label rssBackground = new Label(composite,SWT.NONE);
    imageLoader.setLabelImage(rssBackground, "rss_bg");
    int width = rssBackground.getImage().getBounds().width;
   
    Label subTitle2 = new Label(composite,SWT.WRAP);
    //subTitle2.setFont(subTitleFont);
    subTitle2.setText(MessageText.getString("Wizard.Subscription.rss.subtitle2"));

    Label rssBullet = new Label(composite, SWT.NONE);
    imageLoader.setLabelImage(rssBullet, "rss");

    Label subTitle3 = new Label(composite,SWT.WRAP);
    subTitle3.setFont(subTitleFont);
    subTitle3.setText(MessageText.getString("Wizard.Subscription.rss.subtitle3"));
   
    FormLayout layout = new FormLayout();
    layout.marginWidth = 50;
    layout.marginTop = 25;
    composite.setLayout(layout);
   
    FormData data;

    data = new FormData();
    data.top = new FormAttachment(0);
    data.left = new FormAttachment(0);
    data.right = new FormAttachment(100);
    subTitle1.setLayoutData(data);
   
    data = new FormData();
    data.top = new FormAttachment(subTitle1,5);
    data.left = new FormAttachment(50,-width/2);
    rssBackground.setLayoutData(data);
   
    data = new FormData();
    data.top = new FormAttachment(rssBackground,7,SWT.TOP);
    data.left = new FormAttachment(rssBackground, 45,SWT.LEFT);
    data.right = new FormAttachment(rssBackground, -8,SWT.RIGHT);
    feedUrl.setLayoutData(data);

    data = new FormData();
    data.top = new FormAttachment(rssBackground,15);
    data.left = new FormAttachment(0);
    rssBullet.setLayoutData(data);

    data = new FormData();
    data.top = new FormAttachment(rssBullet,-3,SWT.TOP);
    data.left = new FormAttachment(rssBullet,5);
    data.right = new FormAttachment(100);
    subTitle2.setLayoutData(data);
   
    data = new FormData();
    data.top = new FormAttachment(subTitle2,20);
    data.left = new FormAttachment(0);
    data.right = new FormAttachment(100);
    subTitle3.setLayoutData(data);


    return composite;
  }
 
  private Composite createCreateSearchComposite(Composite parent) {
    Composite composite = new Composite(parent,SWT.NONE);
   
    Label subTitle1 = new Label(composite,SWT.WRAP);
    subTitle1.setFont(subTitleFont);
    subTitle1.setText(MessageText.getString("Wizard.Subscription.search.subtitle1"));
   
    searchInput = new Text(composite, SWT.SINGLE);
    searchInput.setFont(textInputFont);
//    searchInput.setText(MessageText.getString("Wizard.Subscription.search.inputPrompt"));
//    searchInput.setData("visited",new Boolean(false));
//   
//    searchInput.addListener(SWT.FocusIn, new Listener() {
//      public void handleEvent(Event arg0) {
//        boolean visited = ((Boolean) searchInput.getData("visited")).booleanValue();
//        if(visited) return;
//        searchInput.setData("visited",new Boolean(true));
//        searchInput.setText("");
//      }
//    });
   
    searchInput.addListener (SWT.DefaultSelection, searchListener);
   
    Label searchBackground = new Label(composite,SWT.NONE);
    imageLoader.setLabelImage(searchBackground, "search_bg");
    int width = searchBackground.getImage().getBounds().width;
   
    Label subTitle2 = new Label(composite,SWT.WRAP);
    subTitle2.setFont(subTitleFont);
    subTitle2.setText(MessageText.getString("Wizard.Subscription.search.subtitle2"));

    Label checkBullet1 = new Label(composite, SWT.NONE);
    imageLoader.setLabelImage(checkBullet1, "icon_check");
    Label checkBullet2 = new Label(composite, SWT.NONE);
    imageLoader.setLabelImage(checkBullet2, "icon_check");

    Label description1 = new Label(composite,SWT.NONE);
    description1.setText(MessageText.getString("Wizard.Subscription.search.subtitle2.sub1"));
    Label description2 = new Label(composite,SWT.NONE);
    description2.setText(MessageText.getString("Wizard.Subscription.search.subtitle2.sub2"));
   
    Label subTitle3 = new Label(composite,SWT.WRAP);
    subTitle3.setFont(subTitleFont);
    subTitle3.setText(MessageText.getString("Wizard.Subscription.search.subtitle3"));
   
    FormLayout layout = new FormLayout();
    layout.marginLeft = 50;
    layout.marginRight = 50;
    layout.marginTop = 25;
    //layout.spacing = 10;
    composite.setLayout(layout);
   
    FormData data;

    data = new FormData();
    data.top = new FormAttachment(0);
    data.left = new FormAttachment(0);
    data.right = new FormAttachment(100);
    subTitle1.setLayoutData(data);
   
    data = new FormData();
    data.top = new FormAttachment(subTitle1,5);
    data.left = new FormAttachment(50,-width/2);
    searchBackground.setLayoutData(data);
   
    data = new FormData();
    data.top = new FormAttachment(searchBackground,7,SWT.TOP);
    data.left = new FormAttachment(searchBackground, 45,SWT.LEFT);
    data.right = new FormAttachment(searchBackground, -8,SWT.RIGHT);
    searchInput.setLayoutData(data);

    data = new FormData();
    data.top = new FormAttachment(searchBackground,15);
    data.left = new FormAttachment(0);
    data.right = new FormAttachment(100);
    subTitle2.setLayoutData(data);
   
    data = new FormData();
    data.top = new FormAttachment(subTitle2,5);
    data.left = new FormAttachment(0);
    checkBullet1.setLayoutData(data);

    data = new FormData();
    data.top = new FormAttachment(checkBullet1,5);
    data.left = new FormAttachment(0);
    checkBullet2.setLayoutData(data);

    data = new FormData();
    data.top = new FormAttachment(checkBullet1, 0, SWT.TOP);
    data.left = new FormAttachment(checkBullet1, 5);
    description1.setLayoutData(data);

    data = new FormData();
    data.top = new FormAttachment(checkBullet2, 0, SWT.TOP);
    data.left = new FormAttachment(checkBullet2, 5);
    description2.setLayoutData(data);
   
    data = new FormData();
    data.top = new FormAttachment(checkBullet2,15);
    data.left = new FormAttachment(0);
    data.right = new FormAttachment(100);
    subTitle3.setLayoutData(data);

    return composite;
  }
 
  private Composite createAvailableSubscriptionComposite(Composite parent) {
    Composite composite = new Composite(parent, SWT.NONE);
   
    Label hsep1 = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
    Label hsep2 = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
   
    Label vsep = new Label(composite, SWT.SEPARATOR | SWT.VERTICAL);
   
    Label subtitle1 = new Label(composite, SWT.NONE);
    Label subtitle2 = new Label(composite, SWT.NONE);
    subtitle1.setFont(subTitleFont);
    subtitle2.setFont(subTitleFont);
    subtitle1.setText(MessageText.getString("Wizard.Subscription.subscribe.library"));
    subtitle2.setText(MessageText.getString("Wizard.Subscription.subscribe.subscriptions"));

    libraryTable = new Table(composite, SWT.FULL_SELECTION | SWT.VIRTUAL | SWT.V_SCROLL | SWT.SINGLE);
   
    final TableColumn torrentColumn = new TableColumn(libraryTable, SWT.NONE);
    torrentColumn.setWidth(50);
   
    final Composite compEmpty = new Composite(composite,SWT.NONE);
    compEmpty.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
    compEmpty.setBackgroundMode(SWT.INHERIT_DEFAULT);
    FillLayout fl = new FillLayout();
    fl.marginHeight = 15;
    fl.marginWidth = 15;
    compEmpty.setLayout(fl);
    compEmpty.setVisible(false);
   
    final Link labelEmpty = new Link(compEmpty,SWT.WRAP);
    labelEmpty.setText(MessageText.getString("Wizard.Subscription.subscribe.library.empty"));
    labelEmpty.setFont(subTitleFont);
    labelEmpty.setForeground(ColorCache.getColor(composite.getDisplay(), "#6D6F6E"));
   
    labelEmpty.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {
        if(event.text != null && (event.text.startsWith("http://") || event.text.startsWith("https://") ) ) {
          Utils.launch(event.text);
        }
      }
    });
   
    final Table subscriptionTable = new Table(composite, SWT.FULL_SELECTION | SWT.VIRTUAL | SWT.V_SCROLL | SWT.SINGLE);
   
    final TableColumn nameColumn = new TableColumn(subscriptionTable, SWT.NONE);
    final TableColumn rankColumn = new TableColumn(subscriptionTable, SWT.NONE);
   
   

   
    //nameColumn.setText("name");
    //rankColumn.setText("rank");
   
//    subscriptionTable.setHeaderVisible(true);
    Listener resizeListener = new Listener() {
     
      int last_width;
     
      public void handleEvent(Event event) {
        Table table = (Table)event.widget ;
        Rectangle rect = table.getClientArea();
        int width = rect.width - 3;
       
        if ( width == last_width ){
          return;
        }
       
        last_width = width;
        int nbColumns = table.getColumnCount();
       
        if(nbColumns == 1) {
          table.getColumns()[0].setWidth(width);
        } else {
         
          if(width > 100 + RANK_COLUMN_WIDTH) {
            table.getColumns()[1].setWidth(RANK_COLUMN_WIDTH);
            table.getColumns()[0].setWidth(width-RANK_COLUMN_WIDTH);
          } else {
            table.getColumns()[0].setWidth(100);
            table.getColumns()[1].setWidth(width-RANK_COLUMN_WIDTH);
          }
        }
       
        ((Table)event.widget).update();
      }
    };
     
    subscriptionTable.addListener(SWT.Resize , resizeListener);
    libraryTable.addListener(SWT.Resize , resizeListener);
   
    final Listener subscriptionSelectionListener = new Listener() {
      public void handleEvent(Event event) {
        if(subscriptionTable.getSelectionCount() == 1) {
          addButton.setEnabled(true);
//          TableItem item = subscriptionTable.getSelection()[0];
          Subscription subscription = subscriptions[subscriptionTable.getSelectionIndex()];
          if(subscription.isSubscribed()) {
            addButton.setEnabled(false);
          } else {
            addButton.setEnabled(true);
          }
          addButton.setData("subscription",subscription);
        } else {
          addButton.setEnabled(false);
        }
      }
    };
   
    final Listener selectionListener = new Listener() {
      public void handleEvent(Event event) {
        TableItem item = (TableItem) event.item;
        subscriptions = (Subscription[]) item.getData("subscriptions");
       
        if(subscriptions != null) {
          Arrays.sort(subscriptions,new Comparator() {
            public int compare(Object o1, Object o2) {
              if(! (o1 instanceof Subscription && o2 instanceof Subscription)) return 0;
              Subscription sub1 = (Subscription) o1;
              Subscription sub2 = (Subscription) o2;
              return (int) (sub2.getCachedPopularity() - sub1.getCachedPopularity());
            }
          });
          subscriptionTable.setItemCount(subscriptions.length);
        }
       
        addButton.setEnabled(false);
        addButton.setData("subscription",null);
        subscriptionTable.clearAll();     
        subscriptionTable.deselectAll();
        if(subscriptionTable.getItemCount() > 0) {
          subscriptionTable.setSelection(0);
          subscriptionSelectionListener.handleEvent(null);
        }
        //subscriptionTable.setFocus();
      }
    };
   
    libraryTable.addListener(SWT.Selection, selectionListener);
   
    if(availableSubscriptions != null) {
      libraryTable.addListener(SWT.SetData, new Listener() {
        public void handleEvent(Event event) {
            TableItem item = (TableItem) event.item;
                int index = libraryTable.indexOf (item);
              
                SubscriptionDownloadDetails subInfo = availableSubscriptions[index];
                item.setText (subInfo.getDownload().getDisplayName());
                item.setData("subscriptions",subInfo.getSubscriptions());
                boolean isSubscribed = false;
                Subscription[] subs = subInfo.getSubscriptions();
                for(int i = 0 ; i < subs.length ; i++) {
                  if(subs[i].isSubscribed()) isSubscribed = true;
                }
                if(isSubscribed) {
                  item.setForeground(display.getSystemColor(SWT.COLOR_GRAY));
                }
               
                if(subInfo.getDownload() == download) {
                  libraryTable.setSelection(item);
                  selectionListener.handleEvent(event);
                }
                if(index == 0 && download == null) {
                  libraryTable.setSelection(item);
                  selectionListener.handleEvent(event);
                }
                if(libraryTable.getSelectionIndex() == index) {
                  //If the item was already selected and we got the SetData afterwards, then let's populate the
                  //subscriptionsTable
                  selectionListener.handleEvent(event);
                }
        }
      });
     
      libraryTable.setItemCount(availableSubscriptions.length);
      if(availableSubscriptions.length == 0) {
        libraryTable.setVisible(false);
        compEmpty.setVisible(true);
      }
    } else {
      //Test code
      libraryTable.addListener(SWT.SetData, new Listener() {
        public void handleEvent(Event event) {
            TableItem item = (TableItem) event.item;
                int index = libraryTable.indexOf (item);
                item.setText ("test " + index);
        }
      });
     
      libraryTable.setItemCount(20);
    }
   
    addButton.setEnabled(false);
    addButton.setData("subscription",null);
   
   
   
    subscriptionTable.addListener(SWT.Selection,subscriptionSelectionListener );
   

    final Image rssIcon = imageLoader.getImage("icon_rss");
    if(availableSubscriptions != null) {
      subscriptionTable.addListener(SWT.SetData, new Listener() {
        public void handleEvent(Event event) {
            final TableItem item = (TableItem) event.item;
                int index = subscriptionTable.indexOf (item);
                Subscription subscription = subscriptions[index];
                item.setImage(rssIcon);
                item.setText(0, subscription.getName());
                item.setData("tooltip", subscription.getNameEx());
                item.setData("popularity", new Long(subscription.getCachedPopularity()));
                if(subscription.isSubscribed()) {
                  item.setForeground(display.getSystemColor(SWT.COLOR_GRAY));
                  subscriptionTable.setSelection(item);
                }
        }
      });
     
    } else {
      //Test code
      subscriptionTable.addListener(SWT.SetData, new Listener() {
        public void handleEvent(Event event) {
            TableItem item = (TableItem) event.item;
                int index = subscriptionTable.indexOf (item);
                item.setImage( rssIcon);
                item.setText (0,"sub test " + index);
                item.setData("popularity", new Long((int)(700*Math.random() - 100 )));
                //item.setText (1,"" + index);
                //item.setImage(1, rssIcon);
        }
      });
    }   
   
    Listener paintListener = new Listener() {
      public void handleEvent(Event event) {
        GC gc = event.gc;
        TableItem item = (TableItem) event.item;

        switch (event.type) {
        case SWT.MeasureItem:
          event.height = 20;
          break;
        case SWT.EraseItem:
          Rectangle bounds = item.getBounds(1);
          gc.setBackground(item.getBackground(1));
          gc.setForeground(item.getBackground(1));
          gc.fillRectangle(bounds);
          break;
        case SWT.PaintItem :
          bounds = item.getBounds(1);
          bounds.width -= 3;
          bounds.height -= 7;
          bounds.x += 1;
          bounds.y += 3;
          gc.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
          gc.fillRectangle(bounds);
          gc.setForeground(rankingBorderColor);
          gc.drawRectangle(bounds);
          bounds.width -= 2;
          bounds.height -= 2;
          bounds.x += 1;
          bounds.y += 1;
         
         
          Long pop = (Long) item.getData("popularity");
          if(pop != null) {
            long popularity = pop.longValue();
            //Rank in pixels between 0 and 80
            //0 -> no subscriber
            //80 -> 1000 subscribers
           
            int rank = 80 * (int) popularity / 1000;
            if(rank > 80) rank = 80;
            if(rank < 5) rank = 5;
           
            Rectangle clipping = gc.getClipping();
           
            bounds.width = rank;
            bounds.height -= 1;
            bounds.x += 1;
            bounds.y += 1;
            gc.setClipping(bounds);
            gc.drawImage(rankingBars, bounds.x, bounds.y);
           
           
            gc.setClipping(clipping);
           
          }
         
          break;
        default:
          break;
        }
      }
    };
   
      // use this as native one end up with progress image overwriting tooltip
   
    new CustomTableTooltipHandler( subscriptionTable );
   
    subscriptionTable.addListener(SWT.EraseItem, paintListener);
    subscriptionTable.addListener(SWT.PaintItem, paintListener);
    subscriptionTable.addListener(SWT.MeasureItem, paintListener);
    libraryTable.addListener(SWT.MeasureItem, paintListener);
   
    FormLayout layout = new FormLayout();
    composite.setLayout(layout);
   
    FormData data;
   
    data = new FormData();
    data.top = new FormAttachment(0, 0);
    data.left = new FormAttachment(40, 0);
    data.bottom = new FormAttachment(100, 0);
    vsep.setLayoutData(data);

    data = new FormData();
    data.top = new FormAttachment(0, 5);
    data.right = new FormAttachment(vsep, 0);
    data.left = new FormAttachment(0, 5);
    subtitle1.setLayoutData(data);

    data = new FormData();
    data.top = new FormAttachment(0, 5);
    data.left = new FormAttachment(vsep, 5);
    data.right = new FormAttachment(100, 0);
    subtitle2.setLayoutData(data);

    data = new FormData();
    data.top = new FormAttachment(subtitle1, 5);
    data.right = new FormAttachment(vsep, 0);
    data.left = new FormAttachment(0, 0);
    hsep1.setLayoutData(data);

    data = new FormData();
    data.top = new FormAttachment(subtitle2, 5);
    data.left = new FormAttachment(vsep, -1);
    data.right = new FormAttachment(100, 0);
    hsep2.setLayoutData(data);

    data = new FormData();
    data.top = new FormAttachment(hsep1, 0);
    data.right = new FormAttachment(vsep, 0);
    data.left = new FormAttachment(0, 0);
    data.bottom = new FormAttachment(100, 0);
   
    if(availableSubscriptions != null && availableSubscriptions.length > 0) {
      libraryTable.setLayoutData(data);
    } else {
      // hack: dispose libraryTable as it's not needed and draws over controls
      //       (makes a white box covering text).  Would be smarter to not
      //       create the libraryTable at all..
      libraryTable.dispose();
      cancelButton.setFocus();
      shell.setDefaultButton(cancelButton);
      compEmpty.setLayoutData(data);
    }

    data = new FormData();
    data.top = new FormAttachment(hsep2, 0);
    data.left = new FormAttachment(vsep, 0);
    data.right = new FormAttachment(100, 0);
    data.bottom = new FormAttachment(100, 0);
    subscriptionTable.setLayoutData(data);
   
    return composite;
  }
 
  private void createFonts() {
   
    FontData[] fDatas = shell.getFont().getFontData();
   
    for(int i = 0 ; i < fDatas.length ; i++) {
      fDatas[i].setStyle(SWT.BOLD);
    }
    boldFont = new Font(display,fDatas);
   
   
    for(int i = 0 ; i < fDatas.length ; i++) {
      if(org.gudy.azureus2.core3.util.Constants.isOSX) {
        fDatas[i].setHeight(12);
      } else {
        fDatas[i].setHeight(10);
      }
    }
    subTitleFont = new Font(display,fDatas);
   
    for(int i = 0 ; i < fDatas.length ; i++) {
      if(org.gudy.azureus2.core3.util.Constants.isOSX) {
        fDatas[i].setHeight(17);
      } else {
        fDatas[i].setHeight(14);
      }
    }
    titleFont = new Font(display,fDatas);
   
   
    for(int i = 0 ; i < fDatas.length ; i++) {
      if(org.gudy.azureus2.core3.util.Constants.isOSX) {
        fDatas[i].setHeight(14);
      } else {
        fDatas[i].setHeight(12);
      }
      fDatas[i].setStyle(SWT.NONE);
    }
    textInputFont = new Font(display,fDatas);
   
   
  }
 
  private void populateFooter(Composite footer) {
    yesButton = new Button(footer, SWT.PUSH);
    yesButton.setText(MessageText.getString("Button.yes"));
    yesButton.setFont(boldFont);
   
    addButton = new Button(footer, SWT.PUSH);
    addButton.setText(MessageText.getString("Button.add"));
    addButton.setFont(boldFont);
   
    saveButton = new Button(footer, SWT.PUSH);
    saveButton.setText(MessageText.getString("Button.save"));
    saveButton.setEnabled(false);
    saveButton.setFont(boldFont);
   
    searchButton = new Button(footer, SWT.PUSH);
    searchButton.setText(MessageText.getString("Button.search"));
    searchButton.setFont(boldFont);
   
    cancelButton = new Button(footer,SWT.PUSH);
    //cancelButton.setText(MessageText.getString("Button.cancel"));
     
    createButton = new Button(footer,SWT.PUSH);
    createButton.setText(MessageText.getString("Button.createNewSubscription"));
   
    availableButton = new Button(footer,SWT.PUSH);
    availableButton.setText(MessageText.getString("Button.availableSubscriptions"));
   
    FormLayout layout = new FormLayout();
    layout.marginHeight = 5;
    layout.marginWidth = 5;
    layout.spacing = 5;
   
    footer.setLayout(layout);
    FormData data;
   
    data = new FormData();
    data.right = new FormAttachment(100);
    data.width = 100;
   
    yesButton.setLayoutData(data);
    addButton.setLayoutData(data);
    searchButton.setLayoutData(data);
   
    data = new FormData();
    data.right = new FormAttachment(100);
    data.width = 100;
    saveButton.setLayoutData(data);
   
    data = new FormData();
    data.right = new FormAttachment(saveButton);
    data.width = 100;
    cancelButton.setLayoutData(data);
   
    data = new FormData();
    data.left = new FormAttachment(0);
    data.width = 175;
    createButton.setLayoutData(data);
    availableButton.setLayoutData(data);
   
   
    yesButton.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {
        COConfigurationManager.setParameter("subscriptions.opted_in",true);
        COConfigurationManager.save();
        setMode(MODE_SUBSCRIBE);
      }
    });
   
    createButton.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event arg0) {
        setMode(MODE_CREATE_SEARCH);
      }
    });
   
    availableButton.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event arg0) {
        setDefaultAvailableMode();
      }     
    });
   
    cancelButton.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event arg0) {
        shell.close();
      }
    });
   
   
    rssSaveListener = new Listener() {
      public void handleEvent(Event event) {
        try {
          String url_str = feedUrl.getText();
          URL  url = new URL(url_str);
         
          Map user_data = new HashMap();
         
          user_data.put( SubscriptionManagerUI.SUB_EDIT_MODE_KEY, new Boolean( true ));
         
          Subscription subRSS = SubscriptionManagerFactory.getSingleton().createRSS( url_str, url, SubscriptionHistory.DEFAULT_CHECK_INTERVAL_MINS, user_data );
          shell.close();

          final String key = "Subscription_" + ByteFormatter.encodeString(subRSS.getPublicKey());       

          MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
          mdi.showEntryByID(key);

        } catch (Throwable e) {
         
          Utils.reportError( e );
        }
      }
    };
   
    saveButton.addListener(SWT.Selection, rssSaveListener);
   
    addButton.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {
        Subscription subscription = (Subscription) addButton.getData("subscription");
        if(subscription != null) {
          subscription.setSubscribed(true);
          shell.close();
        }
      }
    });
   
    searchListener = new Listener() {
      public void handleEvent(Event event) {
        MainWindow.doSearch(searchInput.getText(),true);
        shell.close();
      }
    };
   
    searchButton.addListener(SWT.Selection, searchListener);
   
  }
 
  private void setDefaultAvailableMode() {
    boolean opted_in = COConfigurationManager.getBooleanParameter("subscriptions.opted_in");
    if(!opted_in) {
      setMode(MODE_OPT_IN);
    } else {
      setMode(MODE_SUBSCRIBE);
    }
  }
 
  private void setMode(int mode) {
    addButton.setVisible(false);
    searchButton.setVisible(false);
    saveButton.setVisible(false);
    yesButton.setVisible(false);
    createButton.setVisible(false);
    availableButton.setVisible(false);
    cancelButton.setText(MessageText.getString("Button.cancel"));
   
    String titleText = TITLE_OPT_IN;
   
    switch (mode) {
    case MODE_SUBSCRIBE :
      mainLayout.topControl = availableSubscriptionComposite;
      titleText = TITLE_SUBSCRIBE;
      createButton.setVisible(true);
      addButton.setVisible(true);
      shell.setDefaultButton(addButton);
      break;
     
    case MODE_CREATE_RSS :
      mainLayout.topControl = createComposite;
      createTabFolder.setSelection(createRSSTabItem);
      titleText = TITLE_CREATE;
      availableButton.setVisible(true);
      saveButton.setVisible(true);
      shell.setDefaultButton(saveButton);
      break;
     
    case MODE_CREATE_SEARCH :
      mainLayout.topControl = createComposite;
      createTabFolder.setSelection(createSearchTabItem);
      titleText = TITLE_CREATE;
      availableButton.setVisible(true);
      searchButton.setVisible(true);
      shell.setDefaultButton(searchButton);
      break;
     
    case MODE_OPT_IN:
    default:
      mainLayout.topControl = optinComposite;
      cancelButton.setText(MessageText.getString("Button.no"));
      createButton.setVisible(true);
      yesButton.setVisible(true);
      shell.setDefaultButton(yesButton);
      break;
    }
     
    main.layout(true,true);
   
    title.setText(titleText);
  }
 
  public static void main(String args[]) {
    final SubscriptionWizard sw = new SubscriptionWizard();
       
    while( ! sw.shell.isDisposed()) {
      if(! sw.display.readAndDispatch()) {
        sw.display.sleep();
      }
    }
   
    sw.display.dispose();   
  }
}
TOP

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

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.