Package com.aelitis.azureus.ui.swt.devices

Source Code of com.aelitis.azureus.ui.swt.devices.SBC_DevicesView

/**
* Created on Feb 24, 2009
*
* Copyright 2008 Vuze, Inc.  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; version 2 of the License only.
*
* 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
*/

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

import java.io.File;
import java.net.URL;
import java.util.*;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;

import org.gudy.azureus2.core3.category.Category;
import org.gudy.azureus2.core3.category.CategoryManager;
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.Debug;
import org.gudy.azureus2.plugins.ui.UIManager;
import org.gudy.azureus2.plugins.ui.tables.TableColumn;
import org.gudy.azureus2.plugins.ui.tables.TableColumnCreationListener;
import org.gudy.azureus2.plugins.ui.tables.TableManager;
import org.gudy.azureus2.pluginsimpl.local.PluginInitializer;
import org.gudy.azureus2.ui.swt.*;
import org.gudy.azureus2.ui.swt.URLTransfer;
import org.gudy.azureus2.ui.swt.mainwindow.ClipboardCopy;
import org.gudy.azureus2.ui.swt.shells.MessageBoxShell;
import org.gudy.azureus2.ui.swt.views.table.TableViewSWTMenuFillListener;
import org.gudy.azureus2.ui.swt.views.table.impl.TableViewSWTImpl;
import org.gudy.azureus2.ui.swt.views.utils.ManagerUtils;

import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.AzureusCoreRunningListener;
import com.aelitis.azureus.core.devices.*;
import com.aelitis.azureus.ui.UIFunctions;
import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.UserPrompterResultListener;
import com.aelitis.azureus.ui.common.ToolBarEnabler;
import com.aelitis.azureus.ui.common.table.*;
import com.aelitis.azureus.ui.common.table.impl.TableColumnManager;
import com.aelitis.azureus.ui.common.updater.UIUpdatable;
import com.aelitis.azureus.ui.selectedcontent.SelectedContentManager;
import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
import com.aelitis.azureus.ui.swt.columns.torrent.ColumnThumbnail;
import com.aelitis.azureus.ui.swt.devices.columns.*;
import com.aelitis.azureus.ui.swt.mdi.MdiEntrySWT;
import com.aelitis.azureus.ui.swt.mdi.MultipleDocumentInterfaceSWT;
import com.aelitis.azureus.ui.swt.skin.*;
import com.aelitis.azureus.ui.swt.skin.SWTSkinButtonUtility.ButtonListenerAdapter;
import com.aelitis.azureus.ui.swt.views.skin.InfoBarUtil;
import com.aelitis.azureus.ui.swt.views.skin.SkinView;
import com.aelitis.azureus.ui.swt.views.skin.TorrentListViewsUtils;
import com.aelitis.azureus.util.PlayUtils;

/**
* @author TuxPaper
* @created Feb 24, 2009
*
*/
public class SBC_DevicesView
  extends SkinView
  implements TranscodeQueueListener, ToolBarEnabler, UIUpdatable,
  TranscodeTargetListener, DeviceListener
{
  public static final String TABLE_DEVICES = "Devices";

  public static final String TABLE_TRANSCODE_QUEUE = "TranscodeQueue";

  public static final String TABLE_DEVICE_LIBRARY = "DeviceLibrary";

  private static boolean columnsAdded = false;

  private DeviceManager device_manager;

  private TranscodeManager transcode_manager;

  private TranscodeQueue transcode_queue;

  private TableViewSWTImpl   tvDevices;
  private DragSource       dragSource;
  private DropTarget       dropTarget;
  private int          drag_drop_line_start = -1;
  private TableRowCore[]    drag_drop_rows;

 
  private TableViewSWTImpl<TranscodeFile> tvFiles;

  private MdiEntrySWT mdiEntry;

  private Composite tableJobsParent;

  private Device   device;
  private String  device_name;

  private TranscodeTarget transTarget;

  // @see com.aelitis.azureus.ui.swt.views.skin.SkinView#skinObjectInitialShow(com.aelitis.azureus.ui.swt.skin.SWTSkinObject, java.lang.Object)
  public Object skinObjectInitialShow(SWTSkinObject skinObject, Object params) {
    AzureusCoreFactory.addCoreRunningListener(new AzureusCoreRunningListener() {
      public void azureusCoreRunning(AzureusCore core) {
        initColumns(core);
      }
    });

    device_manager = DeviceManagerFactory.getSingleton();

    transcode_manager = device_manager.getTranscodeManager();

    transcode_queue = transcode_manager.getQueue();

    MultipleDocumentInterfaceSWT mdi = UIFunctionsManagerSWT.getUIFunctionsSWT().getMDISWT();
    if (mdi != null) {
      mdiEntry = mdi.getCurrentEntrySWT();
      mdiEntry.addToolbarEnabler(this);
      device = (Device) mdiEntry.getDatasource();
    }

    if (device instanceof TranscodeTarget) {
      transTarget = (TranscodeTarget) device;
    }

    if (device == null) {
      new InfoBarUtil(skinObject, "devicesview.infobar", false,
          "DeviceView.infobar", "v3.deviceview.infobar") {
        public boolean allowShow() {
          return true;
        }
      };
    } else if (device instanceof DeviceMediaRenderer) {
      DeviceMediaRenderer renderer = (DeviceMediaRenderer) device;
      int species = renderer.getRendererSpecies();
      String speciesID = null;
      switch (species) {
        case DeviceMediaRenderer.RS_ITUNES:
          speciesID = "itunes";
          break;
        case DeviceMediaRenderer.RS_PS3:
          speciesID = "ps3";
          break;
        case DeviceMediaRenderer.RS_XBOX:
          speciesID = "xbox";
          break;
        case DeviceMediaRenderer.RS_OTHER:{
          String classification = renderer.getClassification();
         
          if ( classification.equals( "sony.PSP")){
            speciesID = "psp";
          }else if ( classification.startsWith( "tivo.")){
            speciesID = "tivo";
          }else if ( classification.toLowerCase().contains( "android")){
            speciesID = "android";
          }
        }
        default:
          break;
      }

      if (speciesID != null) {
        final String fSpeciesID = speciesID;
        new InfoBarUtil(skinObject, "devicesview.infobar", false,
            "DeviceView.infobar." + speciesID, "v3.deviceview.infobar") {
          public boolean allowShow() {
            return true;
          }

          // @see com.aelitis.azureus.ui.swt.views.skin.InfoBarUtil#created(com.aelitis.azureus.ui.swt.skin.SWTSkinObject)
          protected void created(SWTSkinObject parent) {
            SWTSkinObjectText soLine1 = (SWTSkinObjectText) skin.getSkinObject(
                "line1", parent);
            soLine1.setTextID("v3.deviceview.infobar.line1.generic",
                new String[] {
                  device.getName()
                });
            SWTSkinObjectText soLine2 = (SWTSkinObjectText) skin.getSkinObject(
                "line2", parent);
            soLine2.setTextID("v3.deviceview.infobar.line2." + fSpeciesID);
          }
        };
      }
    }

    SWTSkinObject soAdvInfo = getSkinObject("advinfo");
    if (soAdvInfo != null) {
      initAdvInfo(soAdvInfo);
    }

    if (device != null) {
      device_name = device.getName();
     
      SWTSkinObject soTitle = getSkinObject("title");
      if (soTitle instanceof SWTSkinObjectText) {
        ((SWTSkinObjectText) soTitle).setTextID("device.view.heading",
            new String[] {
              device_name
            });
      }
    }

    return null;
  }

  /**
   *
   *
   * @since 4.1.0.5
   */
  private void initColumns(AzureusCore core) {
    if (columnsAdded) {
      return;
    }
    columnsAdded = true;
    UIManager uiManager = PluginInitializer.getDefaultInterface().getUIManager();
    TableManager tableManager = uiManager.getTableManager();
    tableManager.registerColumn(TranscodeFile.class, ColumnTJ_Rank.COLUMN_ID,
        new TableColumnCreationListener() {
          public void tableColumnCreated(TableColumn column) {
            new ColumnTJ_Rank(column);
            if (!column.getTableID().equals(TABLE_TRANSCODE_QUEUE)) {
              column.setVisible(false);
            }
          }
        });
    tableManager.registerColumn(TranscodeFile.class, ColumnThumbnail.COLUMN_ID,
        new TableColumnCreationListener() {
          public void tableColumnCreated(TableColumn column) {
            new ColumnThumbnail(column);
            column.setWidth(70);
            column.setVisible(false);
          }
        });
    tableManager.registerColumn(TranscodeFile.class, ColumnTJ_Name.COLUMN_ID,
        new TableColumnCreationListener() {
          public void tableColumnCreated(TableColumn column) {
            new ColumnTJ_Name(column);
            if (column.getTableID().equals(TABLE_TRANSCODE_QUEUE)) {
              column.setWidth(200);
            } else if (!column.getTableID().endsWith(":type=1")) {
              column.setWidth(140);
            }
          }
        });
    tableManager.registerColumn(TranscodeFile.class,
        ColumnTJ_Duration.COLUMN_ID, new TableColumnCreationListener() {
          public void tableColumnCreated(TableColumn column) {
            new ColumnTJ_Duration(column);
          }
        });
    tableManager.registerColumn(TranscodeFile.class, ColumnTJ_Device.COLUMN_ID,
        new TableColumnCreationListener() {
          public void tableColumnCreated(TableColumn column) {
            new ColumnTJ_Device(column);
            column.setVisible(false);
          }
        });
    tableManager.registerColumn(TranscodeFile.class,
        ColumnTJ_Profile.COLUMN_ID, new TableColumnCreationListener() {
          public void tableColumnCreated(TableColumn column) {
            new ColumnTJ_Profile(column);
            if (column.getTableID().equals(TABLE_TRANSCODE_QUEUE)) {
              column.setWidth(70);
            }
          }
        });

    tableManager.registerColumn(TranscodeFile.class,
        ColumnTJ_Resolution.COLUMN_ID, new TableColumnCreationListener() {
          public void tableColumnCreated(TableColumn column) {
            new ColumnTJ_Resolution(column);
            column.setVisible(false);
            if (column.getTableID().equals(TABLE_TRANSCODE_QUEUE)) {
              column.setWidth(95);
            }
          }
        });

    tableManager.registerColumn(TranscodeFile.class, ColumnTJ_Status.COLUMN_ID,
        new TableColumnCreationListener() {
          public void tableColumnCreated(TableColumn column) {
            new ColumnTJ_Status(column);
          }
        });
    tableManager.registerColumn(TranscodeFile.class,
        ColumnTJ_Completion.COLUMN_ID, new TableColumnCreationListener() {
          public void tableColumnCreated(TableColumn column) {
            new ColumnTJ_Completion(column);
            column.setWidth(145);
          }
        });
    tableManager.registerColumn(TranscodeFile.class,
        ColumnTJ_CopiedToDevice.COLUMN_ID, new TableColumnCreationListener() {
          public void tableColumnCreated(TableColumn column) {
            new ColumnTJ_CopiedToDevice(column);

            if (column.getTableID().endsWith(":type=1")
                || column.getTableID().equals(TABLE_TRANSCODE_QUEUE)) {

              column.setVisible(false);
            }
          }
        });
   
    tableManager.registerColumn(TranscodeFile.class,
        ColumnTJ_Category.COLUMN_ID, new TableColumnCreationListener() {
          public void tableColumnCreated(TableColumn column) {
            new ColumnTJ_Category(column);
          }
        });
   
    TableColumnManager tcm = TableColumnManager.getInstance();
    String[] defaultLibraryColumns = {
      ColumnTJ_Rank.COLUMN_ID,
      ColumnTJ_Name.COLUMN_ID,
      ColumnTJ_Duration.COLUMN_ID,
      ColumnTJ_Device.COLUMN_ID,
      ColumnTJ_Status.COLUMN_ID,
      ColumnTJ_Completion.COLUMN_ID,
    };
    tcm.setDefaultColumnNames(TABLE_TRANSCODE_QUEUE, defaultLibraryColumns);
   
    String[] defaultQColumns = {
      ColumnTJ_Name.COLUMN_ID,
      ColumnTJ_Duration.COLUMN_ID,
      ColumnTJ_Profile.COLUMN_ID,
      ColumnTJ_Status.COLUMN_ID,
      ColumnTJ_Completion.COLUMN_ID,
    };
    tcm.setDefaultColumnNames(TABLE_DEVICE_LIBRARY, defaultQColumns);
  }

  // @see com.aelitis.azureus.ui.swt.views.skin.SkinView#skinObjectShown(com.aelitis.azureus.ui.swt.skin.SWTSkinObject, java.lang.Object)
  public Object skinObjectShown(SWTSkinObject skinObject, Object params) {
    super.skinObjectShown(skinObject, params);

    transcode_queue.addListener(this);

    if (transTarget != null) {
      transTarget.addListener(this);
    }

    SWTSkinObject soDeviceList = getSkinObject("device-list");
    if (soDeviceList != null) {
      initDeviceListTable((Composite) soDeviceList.getControl());
    }

    SWTSkinObject soTranscodeQueue = getSkinObject("transcode-queue");
    if (soTranscodeQueue != null) {
      initTranscodeQueueTable((Composite) soTranscodeQueue.getControl());
    }

    if ( device != null ){

      device.addListener( this );
    }
   
    if (device instanceof TranscodeTarget){
   
      createDragDrop( tvFiles!=null?tvFiles:tvDevices);
    }
   
    setAdditionalInfoTitle(false);

    // This is bad.  Example:
    // 1) Do a search
    // 2) Sidebar entry opens under Devices
    // 3) Close search sidebar
    // 4) Device entry gets auto-selected
    // 5) User gets ftux
    // 6) User says no, anger increases
    // 7) Go to 1
    //DevicesFTUX.ensureInstalled();

    return null;
  }

  /**
   * @param soAdvInfo
   *
   * @since 4.1.0.5
   */
  private void initAdvInfo(SWTSkinObject soAdvInfo) {
    SWTSkinButtonUtility btnAdvInfo = new SWTSkinButtonUtility(soAdvInfo);
    btnAdvInfo.addSelectionListener(new ButtonListenerAdapter() {
      public void pressed(SWTSkinButtonUtility buttonUtility,
          SWTSkinObject skinObject, int stateMask) {
        SWTSkinObject soArea = getSkinObject("advinfo-area");
        if (soArea != null) {
          boolean newVisibility = !soArea.isVisible();
          setAdditionalInfoTitle(newVisibility);
        }
      }
    });
    setAdditionalInfoTitle(false);
  }

  /**
   * @param newVisibility
   *
   * @since 4.1.0.5
   */
  protected void setAdditionalInfoTitle(boolean newVisibility) {
    SWTSkinObject soArea = getSkinObject("advinfo-area");
    if (soArea != null) {
      soArea.setVisible(newVisibility);
    }
    SWTSkinObject soText = getSkinObject("advinfo-title");
    if (soText instanceof SWTSkinObjectText) {
      String s = (newVisibility ? "[-]" : "[+]");
      if (device != null) {
        s += "Additional Device Info and Settings";
      } else {
        s += "General Options";
      }
      ((SWTSkinObjectText) soText).setText(s);
    }
  }

  // @see com.aelitis.azureus.ui.swt.views.skin.SkinView#skinObjectHidden(com.aelitis.azureus.ui.swt.skin.SWTSkinObject, java.lang.Object)
  public Object skinObjectHidden(SWTSkinObject skinObject, Object params) {
    transcode_queue.removeListener(this);

    if (transTarget != null) {
      transTarget.removeListener(this);
    }

    if ( device != null ){
     
      device.removeListener( this );
    }
   
    synchronized (this) {
      if (tvFiles != null) {
        tvFiles.delete();
        tvFiles = null;
      }
    }
    Utils.disposeSWTObjects(new Object[] {
      tableJobsParent,
      dropTarget,
      dragSource,
    });
    if (tvDevices != null) {
      tvDevices.delete();
      tvDevices = null;
    }

    return super.skinObjectHidden(skinObject, params);
  }

  /**
   * @param control
   *
   * @since 4.1.0.5
   */
  private void initTranscodeQueueTable(Composite control) {
    String tableID;

    if (device == null) {

      tableID = TABLE_TRANSCODE_QUEUE;

    } else {

      tableID = TABLE_DEVICE_LIBRARY;

      if (device instanceof DeviceMediaRenderer) {

        DeviceMediaRenderer dmr = (DeviceMediaRenderer)device;
       
        if (!(dmr.canCopyToDevice()||dmr.canCopyToFolder())) {

          tableID += ":type=1";
        }
      }
    }

    tvFiles = new TableViewSWTImpl<TranscodeFile>(TranscodeFile.class, tableID,
        tableID, new TableColumnCore[0], device == null
            ? ColumnTJ_Rank.COLUMN_ID : ColumnTJ_Status.COLUMN_ID, SWT.MULTI
            | SWT.FULL_SELECTION | SWT.VIRTUAL);
    tvFiles.setRowDefaultHeight(25);
    tvFiles.setHeaderVisible(true);
    tvFiles.setParentDataSource(device);

    tableJobsParent = new Composite(control, SWT.NONE);
    tableJobsParent.setLayoutData(Utils.getFilledFormData());
    GridLayout layout = new GridLayout();
    layout.marginHeight = layout.marginWidth = layout.verticalSpacing = layout.horizontalSpacing = 0;
    tableJobsParent.setLayout(layout);

    tvFiles.addSelectionListener(new TableSelectionListener() {

      public void selected(TableRowCore[] row) {
        SelectedContentManager.clearCurrentlySelectedContent();

        UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
        if (uiFunctions != null) {
          uiFunctions.refreshIconBar();
        }
       
      }

      public void mouseExit(TableRowCore row) {
      }

      public void mouseEnter(TableRowCore row) {
      }

      public void focusChanged(TableRowCore focus) {
        SelectedContentManager.clearCurrentlySelectedContent();
       
        UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
        if (uiFunctions != null) {
          uiFunctions.refreshIconBar();
        }
      }

      public void deselected(TableRowCore[] rows) {
        SelectedContentManager.clearCurrentlySelectedContent();
       
        UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
        if (uiFunctions != null) {
          uiFunctions.refreshIconBar();
        }
      }

      public void defaultSelected(TableRowCore[] rows, int stateMask) {
        SelectedContentManager.clearCurrentlySelectedContent();
       
      }
    }, false);

    tvFiles.addLifeCycleListener(new TableLifeCycleListener() {
      public void tableViewInitialized() {
        if (transTarget == null) {
          // just add all jobs' files
          TranscodeJob[] jobs = transcode_queue.getJobs();
          for (TranscodeJob job : jobs) {
            TranscodeFile file = job.getTranscodeFile();
            if (file != null) {
              tvFiles.addDataSource(file);
            }
          }
        } else {
          tvFiles.addDataSources(transTarget.getFiles());
        }
      }

      public void tableViewDestroyed() {
      }
    });

    tvFiles.addMenuFillListener(new TableViewSWTMenuFillListener() {
      public void fillMenu(String sColumnName, Menu menu) {
        SBC_DevicesView.this.fillMenu(menu);
      }

      public void addThisColumnSubMenu(String columnName, Menu menuThisColumn) {
      }
    });

    tvFiles.addKeyListener(
      new KeyListener()
      {
        public void
        keyPressed(
          KeyEvent e )
        {
          if ( e.stateMask == 0 && e.keyCode == SWT.DEL ){
           
            TranscodeFile[] selected;
           
            synchronized (this) {
             
              if ( tvFiles == null ){
               
                selected = new TranscodeFile[0];
               
              }else{
             
                List<Object> selectedDataSources = tvFiles.getSelectedDataSources();
                selected = selectedDataSources.toArray(new TranscodeFile[0]);
              }
            }
           
            if ( selected.length > 0 ){
           
              deleteFiles(selected, 0);
            }
           
            e.doit = false;
          }
        }
       
        public void
        keyReleased(
          KeyEvent arg0 )
        {
        }
      });
   
    tvFiles.initialize(tableJobsParent);

    control.layout(true, true);
  }

  /**
   * @param menu
   *
   * @since 4.0.0.5
   */
  protected void fillMenu(Menu menu) {

    Object[] _files = tvFiles.getSelectedDataSources().toArray();

    final TranscodeFile[] files = new TranscodeFile[_files.length];

    System.arraycopy(_files, 0, files, 0, files.length);

    // open file

    final MenuItem open_item = new MenuItem(menu, SWT.PUSH);

    Messages.setLanguageText(open_item, "MyTorrentsView.menu.open");

    Utils.setMenuItemImage(open_item, "run");

    File target_file = null;
    File source_file = null;

    try {
      if (files.length == 1) {

        target_file = files[0].getTargetFile().getFile( true );

        if (!target_file.exists()) {

          target_file = null;
        }
      }
    } catch (Throwable e) {

      Debug.out(e);
    }

    try {
      if (files.length == 1) {

        source_file = files[0].getSourceFile().getFile( true );

        if (!source_file.exists()) {

          source_file = null;
        }
      }
    } catch (Throwable e) {

      Debug.out(e);
    }

    final File f_target_file = target_file;
    final File f_source_file = source_file;

    open_item.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent ev) {

        Utils.launch(f_target_file.getAbsolutePath());
      };
    });

    open_item.setEnabled(target_file != null);

    // show in explorer

    final boolean use_open_containing_folder = COConfigurationManager.getBooleanParameter("MyTorrentsView.menu.show_parent_folder_enabled");

    final MenuItem show_item = new MenuItem(menu, SWT.PUSH);

    Messages.setLanguageText(show_item, "MyTorrentsView.menu."
        + (use_open_containing_folder ? "open_parent_folder" : "explore"));

    show_item.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {

        ManagerUtils.open(
            f_target_file != null ? f_target_file : f_source_file,
            use_open_containing_folder);
      };
    });

    show_item.setEnabled((source_file != null && !files[0].isComplete())
        || (target_file != null && files[0].isComplete()));

   
      // category
   
      Menu menu_category = new Menu(menu.getShell(), SWT.DROP_DOWN);
      final MenuItem item_category = new MenuItem(menu, SWT.CASCADE);
      Messages.setLanguageText(item_category, "MyTorrentsView.menu.setCategory");
      item_category.setMenu(menu_category);

      addCategorySubMenu( menu_category, files );

   
    new MenuItem(menu, SWT.SEPARATOR);

    // pause

    final MenuItem pause_item = new MenuItem(menu, SWT.PUSH);

    pause_item.setText(MessageText.getString("v3.MainWindow.button.pause"));

    pause_item.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {

        for (int i = 0; i < files.length; i++) {
          TranscodeJob job = files[i].getJob();

          if (job != null) {
            job.pause();
          }
        }
      };
    });

    // resume

    final MenuItem resume_item = new MenuItem(menu, SWT.PUSH);

    resume_item.setText(MessageText.getString("v3.MainWindow.button.resume"));

    resume_item.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        for (int i = 0; i < files.length; i++) {
          TranscodeJob job = files[i].getJob();

          if (job != null) {
            job.resume();
          }
        }
      };
    });

    // separator

    new MenuItem(menu, SWT.SEPARATOR);

    if (device instanceof DeviceMediaRenderer) {

      DeviceMediaRenderer dmr = (DeviceMediaRenderer) device;

      if (dmr.canCopyToDevice() || dmr.canCopyToFolder()) {

        // retry

        final MenuItem retry_item = new MenuItem(menu, SWT.PUSH);

        retry_item.setText(MessageText.getString("device.retry.copy"));

        retry_item.addSelectionListener(new SelectionAdapter() {
          public void widgetSelected(SelectionEvent e) {
            for (int i = 0; i < files.length; i++) {
              TranscodeFile file = files[i];

              if ( file.getCopyToDeviceFails() > 0 || file.isCopiedToDevice() ){

                file.retryCopyToDevice();
              }
            }
          };
        });

        retry_item.setEnabled(false);

        for (TranscodeFile file : files) {

          if ( file.getCopyToDeviceFails() > 0 || file.isCopiedToDevice()) {

            retry_item.setEnabled(true);
          }
        }

        // separator

        new MenuItem(menu, SWT.SEPARATOR);
      }
    }

    // copy stream uri

    final MenuItem sc_item = new MenuItem(menu, SWT.PUSH);

    sc_item.setText(MessageText.getString("devices.copy_url"));

    if (files.length == 1) {

      final URL url = files[0].getStreamURL();

      if (url != null) {

        sc_item.addSelectionListener(new SelectionAdapter() {
          public void widgetSelected(SelectionEvent e) {
            ClipboardCopy.copyToClipBoard(url.toExternalForm());
          };
        });

      } else {

        sc_item.setEnabled(false);
      }
    } else {

      sc_item.setEnabled(false);
    }

    // remove

    int  comp   = 0;
    int  incomp  = 0;
   
    for ( TranscodeFile f: files ){
     
      if ( f.isComplete()){
        comp++;
      }else{
        incomp++;
      }
    }
    final MenuItem remove_item = new MenuItem(menu, SWT.PUSH);

    String  text;
   
    if ( comp == 0 ){
      text = "devices.cancel_xcode";
    }else if ( incomp == 0 ){
      text = "azbuddy.ui.menu.remove";
    }else{
      text = "devices.cancel_xcode_del";
    }
   
    remove_item.setText(MessageText.getString(text));

    Utils.setMenuItemImage(remove_item, "delete");

    remove_item.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        deleteFiles(files, 0);
      };
    });

    // separator

    new MenuItem(menu, SWT.SEPARATOR);

    // Logic to disable items

    boolean has_selection = files.length > 0;

    remove_item.setEnabled(has_selection);

    boolean can_pause = has_selection;
    boolean can_resume = has_selection;

    int job_count = 0;

    for (int i = 0; i < files.length; i++) {
      TranscodeJob job = files[i].getJob();
      if (job == null) {
        continue;
      }

      job_count++;

      int state = job.getState();

      if (state != TranscodeJob.ST_RUNNING || !job.canPause()) {

        can_pause = false;
      }

      if (state != TranscodeJob.ST_PAUSED) {

        can_resume = false;
      }
    }

    pause_item.setEnabled(can_pause && job_count > 0);
    resume_item.setEnabled(can_resume && job_count > 0);
  }
 
  private void
  addCategorySubMenu(
    Menu            menu_category,
    final TranscodeFile[]    files )
  {
    MenuItem[] items = menu_category.getItems();
    int i;
    for (i = 0; i < items.length; i++) {
      items[i].dispose();
    }

    Category[] categories = CategoryManager.getCategories();
    Arrays.sort(categories);

    if (categories.length > 0) {
      Category catUncat = CategoryManager.getCategory(Category.TYPE_UNCATEGORIZED);
      if (catUncat != null) {
        final MenuItem itemCategory = new MenuItem(menu_category, SWT.PUSH);
        Messages.setLanguageText(itemCategory, catUncat.getName());
        itemCategory.setData("Category", catUncat);
        itemCategory.addListener(SWT.Selection, new Listener() {
          public void handleEvent(Event event) {
            MenuItem item = (MenuItem)event.widget;
            assignSelectedToCategory((Category)item.getData("Category"),files);
          }
        });

        new MenuItem(menu_category, SWT.SEPARATOR);
      }

      for (i = 0; i < categories.length; i++) {
        if (categories[i].getType() == Category.TYPE_USER) {
          final MenuItem itemCategory = new MenuItem(menu_category, SWT.PUSH);
          itemCategory.setText(categories[i].getName());
          itemCategory.setData("Category", categories[i]);

          itemCategory.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
              MenuItem item = (MenuItem)event.widget;
              assignSelectedToCategory((Category)item.getData("Category"),files);
            }
          });
        }
      }

      new MenuItem(menu_category, SWT.SEPARATOR);
    }

    final MenuItem itemAddCategory = new MenuItem(menu_category, SWT.PUSH);
    Messages.setLanguageText(itemAddCategory,
    "MyTorrentsView.menu.setCategory.add");

    itemAddCategory.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {
        addCategory(files);
      }
    });

  }

  private void
  addCategory(
    TranscodeFile[]    files
  {
    CategoryAdderWindow adderWindow = new CategoryAdderWindow(Display.getDefault());
    Category newCategory = adderWindow.getNewCategory();
    if (newCategory != null)
      assignSelectedToCategory(newCategory,files);
  }

  private void
  assignSelectedToCategory(
    Category       category,
    TranscodeFile[]    files )
  {
    String[]  cats;
   
    if ( category.getType() == Category.TYPE_UNCATEGORIZED ){
   
      cats = new String[0];
     
    }else{
     
      cats = new String[]{ category.getName()};
    }
   
    for ( TranscodeFile file: files ){
     
      file.setCategories( cats );
    }
  }

  public void
  deviceChanged(
    Device    device )
  {
    String name = device.getName();
   
    if ( !name.equals( device_name )){
     
      device_name = name;
     
      // ensure name is up to date
      SWTSkinObject soTitle = getSkinObject("title");
      if (soTitle instanceof SWTSkinObjectText) {
        ((SWTSkinObjectText) soTitle).setTextID("device.view.heading",
            new String[] {
              name
            });
      }
    }
  }
 
 
  /**
   *
   *
   * @param parent
   * @since 4.1.0.5
   */
  private void initDeviceListTable(Composite control) {
    tvDevices = new TableViewSWTImpl(TranscodeProvider.class, TABLE_DEVICES,
        TABLE_DEVICES, new TableColumnCore[0], ColumnTJ_Rank.COLUMN_ID);
    tvDevices.setRowDefaultHeight(25);
    tvDevices.setHeaderVisible(true);

    Composite parent = new Composite(control, SWT.NONE);
    parent.setLayoutData(Utils.getFilledFormData());
    GridLayout layout = new GridLayout();
    layout.marginHeight = layout.marginWidth = layout.verticalSpacing = layout.horizontalSpacing = 0;
    parent.setLayout(layout);
    
    tvDevices.initialize(parent);
  }

  // @see com.aelitis.azureus.core.devices.TranscodeQueueListener#jobAdded(com.aelitis.azureus.core.devices.TranscodeJob)
  public void jobAdded(TranscodeJob job) {
    synchronized (this) {
      if (tvFiles == null) {
        return;
      }

      if (transTarget == null) {
        TranscodeFile file = job.getTranscodeFile();
        if (file != null) {
          tvFiles.addDataSource(file);
        }
      }
    }
  }

  // @see com.aelitis.azureus.core.devices.TranscodeQueueListener#jobChanged(com.aelitis.azureus.core.devices.TranscodeJob)
  public void jobChanged(TranscodeJob job) {
    synchronized (this) {
      if (tvFiles == null) {
        return;
      }
      TableRowCore row = tvFiles.getRow(job.getTranscodeFile());
      if (row != null) {
        row.invalidate();
        if (row.isVisible()) {
          UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
          if (uiFunctions != null) {
            uiFunctions.refreshIconBar();
          }
        }
      }
    }
  }

  // @see com.aelitis.azureus.core.devices.TranscodeQueueListener#jobRemoved(com.aelitis.azureus.core.devices.TranscodeJob)
  public void jobRemoved(TranscodeJob job) {
    synchronized (this) {
      if (tvFiles == null) {
        return;
      }
      if (transTarget == null) {
        TranscodeFile file = job.getTranscodeFile();
        if (file != null) {
          tvFiles.removeDataSource(file);
        }
      } else {
        TableRowCore row = tvFiles.getRow(job.getTranscodeFile());
        if (row != null) {
          row.invalidate();
          if (row.isVisible()) {
            UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
            if (uiFunctions != null) {
              uiFunctions.refreshIconBar();
            }
          }
        }
      }
    }
  }

  public void refreshToolBar(Map<String, Boolean> list) {
    Object[] selectedDS;
    int size;
    synchronized (this) {
      if (tvFiles == null) {
        return;
      }
      selectedDS = tvFiles.getSelectedDataSources().toArray();
      size = tvFiles.size(false);
    }
    if (selectedDS.length == 0) {
      return;
    }

    list.put("remove", true);

    boolean can_stop = true;
    boolean can_queue = true;
    boolean can_move_up = true;
    boolean can_move_down = true;
    boolean hasJob = false;

    for (Object ds : selectedDS) {
      TranscodeJob job = ((TranscodeFile) ds).getJob();

      if (job == null) {
        continue;
      }

      hasJob = true;

      int index = job.getIndex();

      if (index == 1) {

        can_move_up = false;

      }

      if (index == size) {

        can_move_down = false;
      }

      int state = job.getState();

      if (state != TranscodeJob.ST_PAUSED && state != TranscodeJob.ST_RUNNING
          && state != TranscodeJob.ST_FAILED && state != TranscodeJob.ST_QUEUED) {

        can_stop = false;
      }

      if (state != TranscodeJob.ST_PAUSED && state != TranscodeJob.ST_STOPPED
          && state != TranscodeJob.ST_FAILED) {

        can_queue = false;
      }
    }

    if (!hasJob) {
      can_stop = can_queue = can_move_down = can_move_up = false;
    }

    list.put("stop", can_stop);
    list.put("start", can_queue);
    list.put("up", can_move_up);
    list.put("down", can_move_down);
   
    if ( selectedDS.length == 1 ){
     
      TranscodeFile f = (TranscodeFile)selectedDS[0];
     
      if ( f.isComplete() && f.getStreamURL() != null ){
       
        try{
          if( PlayUtils.canUseEMP( f.getTargetFile())){
       
            list.put( "play", true );
          }
        }catch( Throwable e ){
         
          Debug.out( e );
        }
      }
    }
  }

  public boolean toolBarItemActivated(final String itemKey) {
    // assumed to be on SWT thread, so it's safe to use tvFiles without a sync
    if (tvFiles == null) {
      return false;
    }

    TranscodeFile[] selectedDS = tvFiles.getSelectedDataSources().toArray(new TranscodeFile[0]);
    if (selectedDS.length == 0) {
      return false;
    }

    if (itemKey.equals("remove")) {
      deleteFiles(selectedDS, 0);
      return true;
    }

    if ( itemKey.equals( "play" )){
     
      if ( selectedDS.length == 1 ){
       
        TranscodeFile f = (TranscodeFile)selectedDS[0];
     
        if ( TorrentListViewsUtils.openInEMP( f.getName(), f.getStreamURL()) == 0 ){
       
          return( true );
        }
      }
    }
   
    java.util.List<TranscodeJob> jobs = new ArrayList<TranscodeJob>(
        selectedDS.length);

    for (int i = 0; i < selectedDS.length; i++) {
      TranscodeFile file = (TranscodeFile) selectedDS[i];
      TranscodeJob job = file.getJob();
      if (job != null) {
        jobs.add(job);
      }
    }
   
    if (jobs.size() == 0) {
      return false;
    }

    if (itemKey.equals("up") || itemKey.equals("down")) {

      Collections.sort(jobs, new Comparator<TranscodeJob>() {
        public int compare(TranscodeJob j1, TranscodeJob j2) {

          return ((itemKey.equals("up") ? 1 : -1) * (j1.getIndex() - j2.getIndex()));
        }
      });
    }

    boolean didSomething = false;
    boolean forceSort = false;
    for (TranscodeJob job : jobs) {

      if (itemKey.equals("stop")) {

        job.stop();
        didSomething = true;

      } else if (itemKey.equals("start")) {

        didSomething = true;
        job.queue();

      } else if (itemKey.equals("up")) {

        didSomething = true;
        job.moveUp();

        TableColumnCore sortColumn = tvFiles.getSortColumn();
        forceSort = sortColumn != null
            && sortColumn.getName().equals(ColumnTJ_Rank.COLUMN_ID);

      } else if (itemKey.equals("down")) {

        didSomething = true;
        job.moveDown();

        TableColumnCore sortColumn = tvFiles.getSortColumn();
        forceSort = sortColumn != null
            && sortColumn.getName().equals(ColumnTJ_Rank.COLUMN_ID);
      }
    }
   
    tvFiles.refreshTable(forceSort);

    return didSomething;
  }

  // @see com.aelitis.azureus.ui.common.updater.UIUpdatable#getUpdateUIName()
  public String getUpdateUIName() {
    return "DevicesView";
  }

  // @see com.aelitis.azureus.ui.common.updater.UIUpdatable#updateUI()
  public void updateUI() {
    if (tvFiles != null) {
      tvFiles.refreshTable(false);
    }
  }

  // @see com.aelitis.azureus.core.devices.TranscodeTargetListener#fileAdded(com.aelitis.azureus.core.devices.TranscodeFile)
  public void fileAdded(TranscodeFile file) {
    synchronized (this) {
      if (tvFiles != null) {
        tvFiles.addDataSource(file);
      }
    }
  }

  // @see com.aelitis.azureus.core.devices.TranscodeTargetListener#fileChanged(com.aelitis.azureus.core.devices.TranscodeFile, int, java.lang.Object)
  public void fileChanged(TranscodeFile file, int type, Object data) {
    TableRowCore row;
    synchronized (this) {
      if (tvFiles == null) {
        return;
      }
      row = tvFiles.getRow(file);
    }
    if (row != null) {
      row.invalidate();
      if (row.isVisible()) {
        UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
        if (uiFunctions != null) {
          uiFunctions.refreshIconBar();
        }
      }
    }
  }

  // @see com.aelitis.azureus.core.devices.TranscodeTargetListener#fileRemoved(com.aelitis.azureus.core.devices.TranscodeFile)
  public void fileRemoved(TranscodeFile file) {
    synchronized (this) {
      if (tvFiles != null) {
        tvFiles.removeDataSource(file);
      }
    }
  }

  protected void deleteFiles(final TranscodeFile[] toRemove, final int startIndex) {
    if (toRemove[startIndex] == null) {
      int nextIndex = startIndex + 1;
      if (nextIndex < toRemove.length) {
        deleteFiles(toRemove, nextIndex);
      }
      return;
    }

    final TranscodeFile file = toRemove[startIndex];
    try {

      File cache_file = file.getCacheFileIfExists();

      if (cache_file != null && cache_file.exists() && file.isComplete()) {

        String path = cache_file.toString();

        String title = MessageText.getString("xcode.deletedata.title");

        String copy_text = "";

        Device device = file.getDevice();

        if (device instanceof DeviceMediaRenderer) {

          DeviceMediaRenderer dmr = (DeviceMediaRenderer)device;
         
          File copy_to = dmr.getCopyToFolder();
         
          if ( dmr.canCopyToDevice() || ( dmr.canCopyToFolder() && copy_to != null && copy_to.exists())){

            copy_text = MessageText.getString("xcode.deletedata.message.2",
                new String[] {
                  device.getName()
                });
          }
        }

        String text = MessageText.getString("xcode.deletedata.message",
            new String[] {
              file.getName(),
              file.getProfileName(),
              copy_text
            });

        MessageBoxShell mb = new MessageBoxShell(title, text);
        mb.setRemember("xcode.deletedata.noconfirm.key", false,
            MessageText.getString("deletedata.noprompt"));

        if (startIndex == toRemove.length - 1) {
          mb.setButtons(0, new String[] {
            MessageText.getString("Button.yes"),
            MessageText.getString("Button.no"),
          }, new Integer[] { 0, 1 });
          mb.setRememberOnlyIfButton(0);
        } else {
          mb.setButtons(1, new String[] {
            MessageText.getString("Button.removeAll"),
            MessageText.getString("Button.yes"),
            MessageText.getString("Button.no"),
          }, new Integer[] { 2, 0, 1 });
          mb.setRememberOnlyIfButton(1);
        }

        DownloadManager dm = null;

        if (dm != null) {

          mb.setRelatedObject(dm);
        }

        mb.setLeftImage(SWT.ICON_WARNING);

        mb.open(new UserPrompterResultListener() {
          public void prompterClosed(int result) {
            if (result == -1) {
              return;
            } else if (result == 0) {
              deleteNoCheck(file);
            } else if (result == 2) {
              for (int i = startIndex; i < toRemove.length; i++) {
                if (toRemove[i] != null) {
                  deleteNoCheck(toRemove[i]);
                }
              }
              return;
            }

            int nextIndex = startIndex + 1;
            if (nextIndex < toRemove.length) {
              deleteFiles(toRemove, nextIndex);
            }
          }
        });

      } else {

        deleteNoCheck(file);

        int nextIndex = startIndex + 1;
        if (nextIndex < toRemove.length) {
          deleteFiles(toRemove, nextIndex);
        }
      }
    } catch (Throwable e) {

      Debug.out(e);
    }
  }
 
  private void deleteNoCheck(TranscodeFile file) {
    TranscodeJob job = file.getJob();

    if (job != null) {

      try{
        job.remove();
       
      }catch( TranscodeActionVetoException e ){
       
        UIFunctionsManager.getUIFunctions().forceNotify(
            UIFunctions.STATUSICON_WARNING,
            MessageText.getString( "globalmanager.download.remove.veto" ),
            e.getMessage(), null, null, -1 );
       
        return;
      }
    }

    try {
      file.delete(file.getCacheFileIfExists() != null);
    } catch (TranscodeException e) {
      Debug.out(e);
    }
  }
 
  private void
  createDragDrop(
    final TableViewSWTImpl<?>    table )
  {
    try {

      Transfer[] types = new Transfer[] { TextTransfer.getInstance() };

      if (dragSource != null && !dragSource.isDisposed()) {
        dragSource.dispose();
      }

      if (dropTarget != null && !dropTarget.isDisposed()) {
        dropTarget.dispose();
      }

      dragSource = table.createDragSource(DND.DROP_MOVE | DND.DROP_COPY);
      if (dragSource != null) {
        dragSource.setTransfer(types);
        dragSource.addDragListener(new DragSourceAdapter() {
          private String eventData;

          public void dragStart(DragSourceEvent event) {
            TableRowCore[] rows = table.getSelectedRows();
            if (rows.length != 0) {
              event.doit = true;
              // System.out.println("DragStart");
              drag_drop_line_start = rows[0].getIndex();
              drag_drop_rows = rows;
            } else {
              event.doit = false;
              drag_drop_line_start = -1;
              drag_drop_rows = null;
            }

            // Build eventData here because on OSX, selection gets cleared
            // by the time dragSetData occurs
           
            java.util.List selectedFiles = table.getSelectedDataSources();
           
            eventData="TranscodeFile\n";

            for ( Object o: selectedFiles ){
                           
              TranscodeFile file = (TranscodeFile)o;
             
              if ( file.isComplete()){
               
                try{
                  eventData += file.getTargetFile().getFile( true ).getAbsolutePath() + "\n";
                 
                }catch( Throwable e ){
                 
                }
              }
            }
          }

          public void dragSetData(DragSourceEvent event) {
            // System.out.println("DragSetData");
            event.data = eventData;
          }
        });
      }

      dropTarget = table.createDropTarget(DND.DROP_DEFAULT | DND.DROP_MOVE
          | DND.DROP_COPY | DND.DROP_LINK | DND.DROP_TARGET_MOVE);
      if (dropTarget != null) {
        dropTarget.setTransfer(new Transfer[] { HTMLTransfer.getInstance(),
            URLTransfer.getInstance(), FileTransfer.getInstance(),
            TextTransfer.getInstance() });

        dropTarget.addDropListener(new DropTargetAdapter() {
          public void dropAccept(DropTargetEvent event) {
            event.currentDataType = URLTransfer.pickBestType(event.dataTypes,
                event.currentDataType);
          }

          public void dragEnter(DropTargetEvent event) {
            // no event.data on dragOver, use drag_drop_line_start to determine
            // if ours
            if (drag_drop_line_start < 0) {
              if (event.detail != DND.DROP_COPY) {
                if ((event.operations & DND.DROP_LINK) > 0)
                  event.detail = DND.DROP_LINK;
                else if ((event.operations & DND.DROP_COPY) > 0)
                  event.detail = DND.DROP_COPY;
              }
            } else if (TextTransfer.getInstance().isSupportedType(
                event.currentDataType)) {
              event.detail = event.item == null ? DND.DROP_NONE : DND.DROP_MOVE;
              event.feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_INSERT_BEFORE;
            }
          }

          public void dragOver(DropTargetEvent event) {
            if (drag_drop_line_start >= 0) {
              event.detail = event.item == null ? DND.DROP_NONE : DND.DROP_MOVE;
              event.feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_INSERT_BEFORE;
            }
          }

          public void drop(DropTargetEvent event) {
            try{
              if (   event.data instanceof String &&
                  ((String) event.data).startsWith("TranscodeFile\n")) {
               
                  // todo: support drag and drop reordering of xcode queue?
               
                return;
              }
 
              event.detail = DND.DROP_NONE;
             
              DeviceManagerUI.handleDrop((TranscodeTarget)device, event.data );

            }finally{
             
              drag_drop_line_start = -1;
              drag_drop_rows = null;
            }
          }
        });
      }

    } catch (Throwable t) {
      Debug.out( "failed to init drag-n-drop", t);
    }
  }
}
TOP

Related Classes of com.aelitis.azureus.ui.swt.devices.SBC_DevicesView

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.